2011-09-03 40 views
0

我需要使用SDL_Rect調整已裁剪並傳送到屏幕的圖像的alpha(SDL_Surface *)。我有一個帶有3個圖像的圖像文件(.bmp),我使用SDL_Rect裁剪了每個圖像,但我需要分別調整每個圖像的Alpha。 可以這樣做嗎?使用C++&SDL更改使用SDL_Rect裁剪的圖像的alpha

失敗了,我可以將每個裁剪的SDL_Surface *存儲到一個新的SDL_Surface中,我可以將SDL_SetAlpha應用於每個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?

回答

0

您可以單獨調整每個曲面的alpha,它不會影響任何其他曲面。唯一的條件是,表面應該有一個alpha通道。是檢查有一個alpha通道,這樣做:

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. 
} 

否則,那麼,你必須將圖像與Alpha通道複製到一個新的表面。這是否回答你的問題?

[編輯] 下面是如何將部分表面複製到另一個表面。這部分基於文檔here

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); 

所以是的,用alpha通道創建一個正確大小的表面,然後blit。

+0

鑑於你的表面沒有alpha通道,我建議將每個子部分放在單獨的表面中。如果它絕對需要停留在單一表面上,那麼您可以闖入表面的像素數據並編輯爲手動,我可以更新我的文章,它會告訴您如何去做,但將圖像分解爲單獨的表面更容易,更安全。 –

+0

嗨,我剛剛編輯我的帖子,告訴你我有什麼。如果編輯裁剪的部分不是可能的,你可以告訴我如何將裁剪後的部分另存爲另一個Surface?我無法在任何地方找到一個例子。謝謝你的幫助 – Julz

+0

哇,這看起來很重!好吧,我會給它一個去讓你知道結果。再次感謝你的幫助。 – Julz