SFML pixel array

112
11 декабря 2020, 08:40

Как получить все пиксели с картинки в массив?

 class Player { // класс Игрока
public:
    float x, y, w, h, dx, dy, speed = 0; //координаты игрока х и у, высота ширина, ускорение (по х и по у), сама скорость
    int dir = 0; //направление (direction) движения игрока
    String File; //файл с расширением
    Image image;//сфмл изображение
    Texture texture;//сфмл текстура
    Sprite sprite;//сфмл спрайт
    const int WW = 150;
    const int HH = 150; 
    const int del = 6;
    const int arr[9] = {1, 1, 1, 1, 9, 1, 1, 1, 1};

    sf::Uint8 *pixels = new sf::Uint8[WW*HH*4]; // НЕ МОГУ СДЕЛАТЬ ЕГО КОНСТАНТОЙ, ПОТОМУ ЧТО НАДО ИЗМЕНЯТЬ ПОТОМ
    //const sf::Uint8 *pixels1 = new sf::Uint8[WW*HH*4];

    Player(String F, float X, float Y, float W, float H){  //Конструктор с параметрами(формальными) для класса Player. При создании объекта класса мы будем задавать имя файла, координату Х и У, ширину и высоту
        File = F;//имя файла+расширение
        w = W; h = H;//высота и ширина
        image.loadFromFile("images/" + File);//запихиваем в image наше изображение вместо File мы передадим то, что пропишем при создании объекта. В нашем случае "hero.png" и получится запись идентичная  image.loadFromFile("images/hero/png");


        texture.loadFromImage(image);//закидываем наше изображение в текстуру
        pixels = image.getPixelsPtr(); // getPixelsPrt() ВОЗВРАЩАЕТ const, так что это не работает


        for(int i = 0; i < WW*HH*4; i += 1) {

            pixels[i] = 0* (pixels[i - WW - 4] * arr[0] + pixels[i - WW] * arr[1] + pixels[i - WW + 4] * arr[2] + pixels[i - 4] * arr[3] + pixels[i] * arr[4] + pixels[i + 4] * arr[5] + pixels[i + WW - 4] * arr[6] + pixels[i + WW] * arr[7] + pixels[i + WW + 4] * arr[8]) / del;
            i++;
            pixels[i] = 0*(pixels[i - WW - 4] * arr[0] + pixels[i - WW] * arr[1] + pixels[i - WW + 4] * arr[2] + pixels[i - 4] * arr[3] + pixels[i] * arr[4] + pixels[i + 4] * arr[5] + pixels[i + WW - 4] * arr[6] + pixels[i + WW] * arr[7] + pixels[i + WW + 4] * arr[8]) / del;
            i++;
            pixels[i] = 0*(pixels[i - WW - 4] * arr[0] + pixels[i - WW] * arr[1] + pixels[i - WW + 4] * arr[2] + pixels[i - 4] * arr[3] + pixels[i] * arr[4] + pixels[i + 4] * arr[5] + pixels[i + WW - 4] * arr[6] + pixels[i + WW] * arr[7] + pixels[i + WW + 4] * arr[8]) / del;
            i++;
                //pixels[i] = 255;
            }
        texture.update(pixels);


        //image.createMaskFromColor(Color(41, 33, 59));//убираем ненужный темно-синий цвет, эта тень мне показалась не красивой.
        //  texture.loadFromImage(image);//закидываем наше изображение в текстуру
        sprite.setTexture(texture);//заливаем спрайт текстурой
        x = X; y = Y;//координата появления спрайта
        sprite.setTextureRect(IntRect(0, 0, WW, h));
}

....

Player p("hero.png",150,150,37.5, 37.5);//создаем объект p класса player,задаем "hero.png" как имя файла+расширение, далее координата Х,У, ширина, высота.
Answer 1

Сидел дня 2, ничего в голову не приходило, как только задал вопрос на stackoverflow, так сразу решение придумал, хоть и костыльное, магия)))

pixels1 = image.getPixelsPtr();
for(int i = 0; i < WW*HH*4; i += 1) {
    pixels[i] = pixels1[i];
}
Answer 2

В конструкторе вашего класса сначала при помощи new[] создается массив pixels с размером 150 * 150 * 4. После этого созданный массив вышвыривается в утечку памяти вызовом

pixels = image.getPixelsPtr();

После чего вы работаете с полученным из getPixelsPtr() новым массивом как будто он имеет размер 150 * 150 * 4. Кто вам сказал, что он имеет такой размер?

READ ALSO
Do-while зависает в Qt

Do-while зависает в Qt

Помогите пожалуйста с одним вопросомПишу программу в Qt с интерфейсом

113
Площадь невыпуклого многоугольника

Площадь невыпуклого многоугольника

Задача: Многоугольник (необязательно выпуклый) задан на плоскости перечислением координат вершин в порядке обхода его границыОпределить...

122
Qt5: lineEdit Не учитывается значение с запятой

Qt5: lineEdit Не учитывается значение с запятой

Есть некоторая форма на которой есть lineEdit

104
Запись и чтение объекта из бинарного файла

Запись и чтение объекта из бинарного файла

Неправильно записывает и читает из файлаЗаписывает age = 5и Name = "Масло", а выводит age=0 и Name = ""

113