将图像拆分为64×64块

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

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

int nWidth, nHeight; unsigned char *pImage; 

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

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

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

块图

提前致谢。

只需定义一个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)); } 

我将假设这些块是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和CHUNK_HEIGHT替换“64”,但你明白了。 我还会检查宽度和高度的准确性,基本上你并不真正需要它们(你可以在函数内轻松计算它们)。

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