在linux上实现,图像文件头,位图信息头,彩色板先不用考虑,主要是想问图像数据阵列如何转换,16 bit 是两个字节表示一个像素,而1 bit是一个字节代表8个像素,比如:xsize表示宽度,ysize表示高度,xsize,ysize都是16的整数倍,buf是16bit的数据阵列,buf2是转换的1bit目标数据阵列初始化内存全是0我的代码是
for(int i=0;i<ysize;i++)
for(int j=0;j<xsize;j++)
{
if(buf[i*xsize*2+j*2] != 0)
buf2[ (i*xsize*2+j*2 ) /16 ] |= 1 << j%8;
}可惜转过来不对,请教大家怎么转???
for(int i=0;i<ysize;i++)
for(int j=0;j<xsize;j++)
{
if(buf[i*xsize*2+j*2] != 0)
buf2[ (i*xsize*2+j*2 ) /16 ] |= 1 << j%8;
}可惜转过来不对,请教大家怎么转???
for(int i=0;i <ysize;i++)
for(int j=0;j <xsize;j++)
{
if(buf[i * linew+ j*2] != 0) //注意访问溢出
buf2[ (i * linew + j*2 ) /16 ] |= 1 < < j%8;
}宽 linew =( bmih.biWidth * bmih.biBitCount + 31 ) / 32 * 4;
if(buf[i*xsize*2+j*2] != 0)这句应该可能访问到无用的填充字节吧,不会溢出吧。
目标的位图的buf2的linew也要通过linew2 =( bmih.biWidth + 31 ) / 32 * 4;来计算吧。
if(buf[i*xsize*2+j*2] != 0)
应改为:
if(buf[i*xsize+j] != 0)
如果buf是BYTE数组
if(buf[i*xsize*2+j*2] != 0)
应改为:
if(*(WORD*)(buf+i*xsize*2+j*2) != 0)如果buf2是BYTE数组
buf2[(i*xsize*2+j*2)/16] |= 1 << j%8;
应改为:
buf2[(i*xsize*2+j*2)/8] |= 1 << j%8;
如果buf2是WORD数组
buf2[(i*xsize*2+j*2)/16] |= 1 << j%8;
应改为:
buf2[(i*xsize*2+j*2)/16] |= 1 << j%16;转成1bit后要注意每行按4字节对齐。
另外,二值化一般是选定一个域值,判断大于或小于该值时转成1或0,而不是按是否等于0来决定。
问题解决,再次谢谢大家,都有分啊,呵呵!