2017-09-05 41 views
-1

我想將R8G8B8A8圖像轉換爲R8G8B8圖像,我現在得到的是一個圖像,但有很多掃描線,我每個像素的字節數是4個字節,32位。複製R8G8B8A8圖像到R8G8B8

圖像緩衝區的類型是無符號字符[寬度*高度* 4]是源和目標是無符號字符[寬*高* 3]。

int j = 0; 
    int i = 0; 
    for (int k = 0; k < (width*height); k++) 
    { 
     for(int b = 0; b < 3; b++) 
     { 
      dst[i + b] = src[j + b]; 

     } 
     i+=3; 
     j+=4; 
    } 
+1

什麼是你遇到的問題? – molbdnilo

+0

根據平臺,可能會有更簡單的方法來做到這一點,我知道Windows Imaging組件會爲您做到這一點。我會想象libpng會做類似的事情(快速谷歌搜索顯示'PNG_TRANSFORM_STRIP_ALPHA'是一件東西) – Mgetz

+0

@molbdnilo:它有點低效(無關的循環條件,可以用'i == 3 * width *這個代碼在技術上是正確的,假設打包佈局 – MSalters

回答

0

可能目標圖像,需要在4個字節邊界對齊線:

for(unsigned int y(0); y != height; ++y) 
{ 
    unsigned int sourceStart(y * width * 4); 
    unsigned int destStart(y * ((width * 3 + 3) & 0xfffffffc)); // align on 4 bytes 
    for(unsigned int x(0); x != width; ++x) 
    { 
     for(unsigned int color(0); color != 3; ++color) 
     { 
      dst[destStart++] = src[sourceStart++]; 
     } 
     ++sourceStart; // account for 4th byte in source 
    } 
} 
+0

我發現源圖像的寬度是480,高度是640,所以處理應該是相反的,正確的呢?沒關係?而且dst圖像應該是寬度640和高度480 – andre

0

你可以這樣做:

for (int k = 0; k < width*height; k++) 
{ 
    for(int b = 0; b < 3; b++) 
    { 
     dst[k*3 + b] = src[k*4 + b]; 

    } 
}