我只是想知道如何将像素阵列(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 参数的块)。
提前致谢。
答案 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));
}