将图像拆分为64x64块

时间:2010-09-12 21:05:45

标签: c++ c image-manipulation

我只是想知道如何将像素阵列(R,G,B,A,R,G,B,A,R,G,B,A等)分成64x64块。我自己尝试了几种方法,但它们看起来都过于复杂,而且有点过于混乱。

我有以下变量(显然填充了信息):

int nWidth, nHeight;
unsigned char *pImage;

基本上我想要调用的每个块:

void ProcessChunk(int x, int y, int width, int height)

你可能想知道为什么处理函数有 width height 参数,但是如果图像不能被64整除,那么会有更小的图像边缘的块(右侧和底部)。请参阅此图片以更好地理解我的意思(红色块是具有< 64 width height 参数的块)。

Chunk diagram

提前致谢。

2 个答案:

答案 0 :(得分:2)

我将假设这些块是unsigned char *chunk[64*64*4],与图像本身的方式类似。

int chunkOffset = 0;
int bufferOffset = y*nWidth*4 + x*4;
memset(chunk, 0, 64*64*4*sizeof(unsigned char));
for (int line = 0; line < height; line++)
{
    memcpy(chunk+chunkOffset, buffer+bufferOffset, width*4*sizeof(unsigned char));
    chunkOffset += 64*4;
    bufferOffset += nWidth*4;
}

在实际代码中,我将用sizeof(PIXEL)取代“4”,用CHUNK_WIDTH&amp;取代“64”。 CHUNK_HEIGHT,但你明白了。我也会检查宽度和宽度精度的高度,基本上你并不真正需要它们(你可以在函数内轻松计算它们)。

另请注意,虽然并非真正需要“sizeof(unsigned char)”,但我喜欢将其放在那里进行澄清。它不会影响运行时,因为它是在编译时评估的。

答案 1 :(得分:2)

只需定义一个MIN()宏来确定两个表达式的最小值,然后就可以了:

void ProcessChunk(unsigned char *pImage, int x, int y, int width, int height);

#define MIN(a, b) ((a) < (b) ? (a) : (b))    
#define CHUNKSIZE 64

void ProcessImage(unsigned char *pImage, int nWidth, int nHeight)
{
    int x, y;

    for (x = 0; x < nWidth; x += CHUNKSIZE)
        for (y = 0; y < nHeight; y += CHUNKSIZE)
            ProcessChunk(pImage, x, y, MIN(nWidth - x, CHUNKSIZE), MIN(nHeight - y, CHUNKSIZE));
}