fseek(fb, 54, 0); while(!feof(fb))
{
fread(&newRgb, sizeof(newRgb), 1, fb);
printf("%d:%d:%d:%d", newRgb.rgbBlue, newRgb.rgbGreen, newRgb.rgbRed, newRgb.rgbReserved);
if((0 == newRgb.rgbBlue) && (0 == newRgb.rgbGreen) && (0 == newRgb.rgbRed))
{
while(1);
newRgb.rgbBlue = 0;
newRgb.rgbGreen = 0;
newRgb.rgbRed = 255;
newRgb.rgbReserved = 0;
fseek(fb, -sizeof(newRgb), 1);
fwrite(&newRgb, sizeof(newRgb), 1, fb);
return EXIT_SUCCESS;
}
}
为什么进不到if里面呢 我是想把图片中的 黑色结构体改成 红色的
我用的是vs2005
{
fread(&newRgb, sizeof(newRgb), 1, fb);
printf("%d:%d:%d:%d", newRgb.rgbBlue, newRgb.rgbGreen, newRgb.rgbRed, newRgb.rgbReserved);
if((0 == newRgb.rgbBlue) && (0 == newRgb.rgbGreen) && (0 == newRgb.rgbRed))
{
while(1);
newRgb.rgbBlue = 0;
newRgb.rgbGreen = 0;
newRgb.rgbRed = 255;
newRgb.rgbReserved = 0;
fseek(fb, -sizeof(newRgb), 1);
fwrite(&newRgb, sizeof(newRgb), 1, fb);
return EXIT_SUCCESS;
}
}
为什么进不到if里面呢 我是想把图片中的 黑色结构体改成 红色的
我用的是vs2005
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;}
RGBQUAD;
根据像素点的各颜色分量的信息可以得到其RGB颜色值,由于每个颜色分量只用5位表示,即其最大值为31,因此很大一部分颜色值在16位的BMP图片中是不能够显示的。而且图片应该是很暗的。但是用ACDSEE,PS打开16位BMP图片,显示效果跟24位的BMP差不多。这是为什么呢? 把 5 位的 R ¦G ¦B 值转成 8 位的 R ¦G ¦B 值时,填充的是字节的高5位。相当于最大值为31*8=248, 而并非你说的填充在字节的低5位导致最大值为31把区间[0,31]映射到[0,255]就可以了,亮度低的问题不存在。
好的图象软件会用到抖动之类方法,在减少颜色数目时,提高逼真程度。基本原理:用设计好的几种颜色的组合来表示一种颜色。24色的bmp每一像素是8位r+8位g+8位b一共需要24位来存储一个像素 比如红色就是FF0000
16位的bmp每一像素用16位表示,具体是5位r+6位g+5位b,这个就可点搞
我现在需要一个算法来转换它们
比如定义一个unsigned char 24bit[3]表示24位的一个像素,unsigned char 16bit[2]表示16位的一个像素 把从0到2的8次方之间的数字均匀地映射到0到2的5次方或6次方之间不就可以了吗?具体代码:
void S_Gray(Graphics::TBitmap *Bmp)//灰阶效果
{
long Gray;
BYTE *ptr;
for (int y = 0; y < Bmp->Height; y++)
{
ptr =(BYTE *) Bmp->ScanLine[y];
for (int x = 0; x < Bmp->Width*3; x+=3){
Gray=299*ptr[x+2]+587*ptr[x+1]
+114*ptr[x];
ptr[x]=BYTE(Gray/1000);
ptr[x+1]=BYTE(Gray/1000);
ptr[x+2]=BYTE(Gray/1000);
}
}
}是一个对应的过程,8位色彩表如何对应到5或6位色彩表R = (value & 0x0000F800) >> 8;
G = (value & 0x000007E0) >> 3;
B = (value & 0x0000001F) << 3;value = (R & 0x000000F8) << 8 | (G & 0x000000FC) << 3 | (B & 0x000000F8) >> 3;