Изменить альфа изображения, обрезанного с помощью SDL_Rect, используя C ++ и SDL - PullRequest
0 голосов
/ 03 сентября 2011

Мне нужно отрегулировать альфа-изображение (SDL_Surface *), которое было обрезано и перенесено на экран с помощью SDL_Rect.У меня есть один файл изображения (.bmp) с 3 изображениями, я обрезал каждое изображение с помощью SDL_Rect, но мне нужно настроить альфа каждого изображения отдельно.Можно ли это сделать?

В противном случае я могу сохранить каждый обрезанный SDL_Surface * в новом SDL_Surface, где я могу применить SDL_SetAlpha к каждому?Я понимаю, что могу просто обрезать исходное изображение и импортировать их отдельно, но в этом случае это не вариант.

Я надеюсь, что все это имеет смысл, я новичок, чтобы задавать вопросы здесь, так что извините, если я пошел против протокола в любом случае.

Редактировать:

Вот что у меня есть;

SDL_Rect cropBoxPump1 = { 5, 103, 200, 200 };   
SDL_Rect positionPump1 = { 30, 103, 0, 0 };
SDL_Surface* pumpkinConvertedTo32bit = NULL;    
SDL_Surface *pumpkins = SDL_LoadBMP( "pumpkins_faces.bmp" );

pumpkinConvertedTo32bit = SDL_DisplayFormat( pumpkins );        
SDL_BlitSurface(pumpkinConvertedTo32bit, &cropBoxPump1, screen, &positionPump1);

Итак, на основании чего я могу изменить альфа только той части изображения, которая была обрезана с помощью SDL_Rect?а не весь SDL_Surface?

1 Ответ

0 голосов
/ 03 сентября 2011

Вы можете настроить альфа каждой поверхности индивидуально, это не повлияет на другие поверхности.Единственное условие - поверхность должна иметь альфа-канал.Чтобы проверить, есть ли альфа-канал, сделайте следующее:

SDL_Surface *surface; // Assume this has been allocated elsewhere.

if (surface->format->Amask != 0)
{
   // You have an alpha channel
}
else
{
   // Make a copy to a surface with an alpha channel.
}

В противном случае, тогда да, вам придется скопировать изображение на новую поверхность с альфа-каналом.Это отвечает на ваш вопрос?

[РЕДАКТИРОВАТЬ] Вот как вы можете скопировать части поверхности в другую.Это частично основано на документации здесь .

SDL_Rect cropBox = { 5, 103, 200, 200 };
SDL_Rect position = {0,0,0,0};
Uint32 rmask, gmask, bmask, amask;

/* SDL interprets each pixel as a 32-bit number, so our masks must depend
   on the endianness (byte order) of the machine */
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif
SDL_Surface *newSurface = SDL_CreateRGBSurface(SDL_SWSURFACE,cropBox.w,
                             cropBox.h,32,rmask,gmask,bmask,amask);

SDL_BlitSurface(pumpkins,cropBox,newSurface,position);

Так что, да, создайте поверхность нужного размера с альфа-каналом, а затем добавьте к ней.

...