不好意思了,弱弱的问一下24位的bmp的格式?还有怎么变成灰度啊? 俺是半路出家的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.vckbase.com/document/viewdoc.asp?id=674变成灰度的话把rgb都变成(r+g+b)/3 24位位图没有调色板,是最简单的位图,每个像素占3字节,分别表示R,G,B分量 计算灰度值,0.3 * Red + 0.59 * Green + 0.11 * Blue 这是求加权平均值的公式。 24位灰度bmp不需要调色板,r=g=b8位灰度需要调色板 取出每一点的r,g,b然后t= (r+g+b)/3得到之后把该点的r ,g,b 设为 t 就是 r= b= g = t 就可以了 short getGrayLevel(COLORREF clr){ // 00 rr gg bb short gray; gray=(short)(((clr>>16) & 0xff) * 0.3); gray+=(short)(((clr>>8) & 0xff) * 0.59); gray+=(short)((clr & 0xff) * 0.11); return gray; //由红,绿,蓝值得到灰度值; //pixels[w*j+i]=(255<<24)|(gray<<16)|(gray<<8)|gray; } 同意 arvid_gs(west) ( ) 24位的视频模视中,每个像素占用8位,其系统调色板有256种颜色.在256视频模视中直接用RGB(R,G,B)宏得到的灰度只有4种,黑,深灰(128,128,128),浅灰(192,192,192),白色.在创建逻辑调色板后(这个过程还包括fill logic palette,cresate palette ,realize palette),就可以看到更多的灰度值,这个值取决于你fill logic palette时填充的颜色值,有限制的. 标准公式(源自YUV色彩空间Y值,既亮度或灰度):Y=0.2990R+0.5870G+0.1140B24bit位图中RGB 各占8bit,让后你可以把得出Y的值量化为一个0-255之间的 8bit 数据(取整就行)。如果你要用24bit RGB 色彩空间输出这个灰度的话就这样做:Gray=Y+Y*0x100+Y*0x10000;当然,如果嫌整形乘法慢的话,也可以用 happyili(小厨师) 那样移位的方法。 还有一点,直接(r+g+b)/3,虽然可以用,但是得出的图像从视觉上并不是很符合我们人眼视觉的习惯。普遍做法就是加权平均。彩色电视信号就是YUV色彩空间的。黑白电视接受彩色信号其实就是分离了其中的Y分量,把另外两个色差信号(U,V)丢掉了。 OHA oha1,oha2; for (i=0; i<rect.Height(); i++) for (j=0; j<rect.Width(); j++) { oha1.org=::GetPixel(hdc1,j, i);//hdc1为原图像的句柄 // 近似的转灰度公式 R*0.3+G*0.6+B*0.1 k = (unsigned char)(((unsigned int)oha1.pix.blue)/10) + \ (unsigned char)(((unsigned int)oha1.pix.green)*6/10) + \ (unsigned char)(((unsigned int)oha1.pix.red)*3/10); oha2.pix.blue = k; oha2.pix.green = k; oha2.pix.red = k; ::SetPixel(hdc2,j, i, oha2.org);//hdc2为设置灰度图像的句柄 } OHA 的定义为 typedef struct { unsigned char blue; unsigned char green; unsigned char red; unsigned char alpha; } RGBDATA typedef union { unsigned long org; RGBDATA pix; } OHA, 标准公式:Gray= R*.0299 + G*0.587 + B*0.114整数运算:Gray=(R*299+g*587+B*114+500)/1000 //+500是为了四舍五入 看“二、DIB的结构”http://www.csdn.net/develop/read_article.asp?id=20442 沙子和水如何画? 如何自动设置ListView控件的大小 视频的问题,很郁闷 mfc42. dll 问题 对公司的感觉 请问怎么得到程序所在的路径? 怎么在tab里加入CPage页?? 求遍历USB设备的方法 求用单选框控制对话框的伸缩!! 那天我读一本书,其中“JAVA程序不能执行写盘和访问串行端口的任务”,请问串行端口是指什么? 为什么GetModuleFileNameEx一使用就会出错? 为什么不能使用GetProcAddress返回Kernel32.dll的函数地址?比如RegisterServiceProcess!
8位灰度需要调色板
然后
t= (r+g+b)/3
得到之后把该点的r ,g,b
设为 t 就是 r= b= g = t 就可以了
{
// 00 rr gg bb
short gray; gray=(short)(((clr>>16) & 0xff) * 0.3);
gray+=(short)(((clr>>8) & 0xff) * 0.59);
gray+=(short)((clr & 0xff) * 0.11);
return gray;
//由红,绿,蓝值得到灰度值;
//pixels[w*j+i]=(255<<24)|(gray<<16)|(gray<<8)|gray;
}
24bit位图中RGB 各占8bit,让后你可以把得出Y的值量化为一个0-255之间的 8bit 数据(取整就行)。如果你要用24bit RGB 色彩空间输出这个灰度的话就这样做:Gray=Y+Y*0x100+Y*0x10000;当然,如果嫌整形乘法慢的话,也可以用 happyili(小厨师) 那样移位的方法。
for (i=0; i<rect.Height(); i++)
for (j=0; j<rect.Width(); j++)
{
oha1.org=::GetPixel(hdc1,j, i);//hdc1为原图像的句柄
// 近似的转灰度公式 R*0.3+G*0.6+B*0.1
k = (unsigned char)(((unsigned int)oha1.pix.blue)/10) + \
(unsigned char)(((unsigned int)oha1.pix.green)*6/10) + \
(unsigned char)(((unsigned int)oha1.pix.red)*3/10);
oha2.pix.blue = k;
oha2.pix.green = k;
oha2.pix.red = k;
::SetPixel(hdc2,j, i, oha2.org);//hdc2为设置灰度图像的句柄
}
OHA 的定义为
typedef struct
{
unsigned char blue;
unsigned char green;
unsigned char red;
unsigned char alpha;
} RGBDATA
typedef union
{
unsigned long org;
RGBDATA pix;
} OHA,
http://www.csdn.net/develop/read_article.asp?id=20442