Устранение неполадок (и сравнение) пикселей в SDL2

64
6

Я загружаю PNG файл в SDL2, и я пытаюсь найти "специальные" пиксельные цвета для отслеживания во время анимации spritesheet. Я поместил эти пиксели в свое изображение, но мой код не находит их.

Я использую этот код для чтения пикселей (взятых из Интернета, завернутых в мой собственный класс Texture):

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

switch(bpp) {
case 1:
return *p;
break;

case 2:
return *(Uint16 *)p;
break;

case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
break;

case 4:
return *(Uint32 *)p;
break;

default:
return 0; /* shouldn't happen, but avoids warnings */
}
}

И это важные бит кода, который я использую для сравнения пикселей с "специальными" значениями, которые я задал раньше:

        // convert special SDL_Color to Uint32
Uint32 spec1 = SDL_MapRGBA(_texture->GetSDLSurface()->format, _spec1.r, _spec1.g, _spec1.b, 255);
Uint32 spec2 = SDL_MapRGBA(_texture->GetSDLSurface()->format, _spec2.r, _spec2.g, _spec2.b, 255);

... и, перебирая все пиксели в каждом кадре спрайта...

                    // get pixel at (x, y)
Uint32 pix = _texture->GetPixel(x, y);

// if pixel is a special value, store it in animation
if (pix == spec1)
{
SDL_Point pt = {x, y};
anim->Special1.push_back(pt);
found1 = true;
}
else if (pix == spec2)
{
SDL_Point pt = {x, y};
anim->Special2.push_back(pt);
found2 = true;
}

Теперь я устанавливаю точку останова в этих if-операторах, чтобы проверить, найден ли цвет, но точка останова никогда не достигается. Кто-нибудь знает, в чем проблема?

PS Я тоже пытался использовать SDL_MapRGB(), но это тоже не работает.

[редактировать]

Итак, я попробовал поставить пиксель на 0,0 всего изображения с RGB-значениями 66, 77 и 88. Он читал их как 84, 96 и 107, поэтому, очевидно, цвета либо изменяются, либо не читаются должным образом. Однако, когда я пробую его с определенным значением альфа, он читает его совершенно. Я бы изменил мою систему, чтобы использовать только альфа-значения, но кажется, что редактор пикселей, который я использую, удаляет значение alpha после того, как вы помещаете его в пиксель, и смешивает его с остальной частью изображения.

спросил(а) 2021-01-19T22:19:10+03:00 6 месяцев, 1 неделя назад
1
Решение
63

Ваша формула для смещения неверна, она должна быть:

Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x

(x не нужно умножать на bpp)

Из документов

pitch Длина строки сканирования в байтах

Шаг, также называемый шаг, вычисляется следующим образом:

pitch = width * bytes per pixel

bytes per pixel = (bits per pixel + 7) / 8

Когда вы находитесь в правильном смещении байта, получите Uint32 (для изображения 32bpp) и сравните его.

ответил(а) 2021-01-19T22:19:10+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема