2017-09-05 81 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]; 

    } 
}