`
kanwoerzi
  • 浏览: 1635723 次
文章分类
社区版块
存档分类
最新评论

24位真彩色位图转换成8位灰度图片的代码实现

 
阅读更多

void CGrayDlg::OnToEignt()

{

if(date==NULL)

{

MessageBox("图像内容为空");

return;

}

memcpy(&eightfile,&fileheader,sizeof(fileheader));

eightinfo=(BITMAPINFO *)newBYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];//特别注意,重新分配调色板的BITMAPINF需要动态开辟内存空间,这样调色板才可以被赋值进去

memcpy(eightinfo,&bitinfo,sizeof(bitinfo));//先初始化信息头文件

intl=bitinfo.bmiHeader.biWidth*bitinfo.bmiHeader.biHeight;//计算新的文件大小

if(eight!=NULL)

{

delete []eight;

eight=NULL;

}

//开辟内存并且初始化

eight=new BYTE[l];

memset(eight,255,l);

BYTE temp,r,g,b;

temp=r=g=b=0;

int line=bitinfo.bmiHeader.biWidth*3;

//一下进行赋值操作

for(inti=0;i<bitinfo.bmiHeader.biHeight;i++)

for(intj=0;j<bitinfo.bmiHeader.biWidth;j++)

{

r=date[i*line+3*j];g=date[i*line+3*j+1];b=date[i*line+3*j+2];//获得rgb的值

temp=(BYTE)((77*r+151*g+28*b)>>8);

eight[i*line/3+j]=temp;

}

//以下对调色板进行处理

CGrayDlg::SetRGBQUAD(rgbquad);

memcpy((BYTE*)eightinfo+sizeof(BITMAPINFOHEADER),rgbquad,256*sizeof(RGBQUAD));//对调色板进行赋值,注意eightinfo的指针应该向后移动到指定位置

eightinfo->bmiHeader.biClrUsed=256;

eightinfo->bmiHeader.biSizeImage=l;

eightinfo->bmiHeader.biBitCount=8;

eightfile.bfSize=sizeof(eightfile)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)+l;

eightfile.bfOffBits=eightfile.bfSize-l;

int w=eightinfo->bmiHeader.biWidth;

int y=eightinfo->bmiHeader.biHeight;

StretchDIBits(GetDC()->GetSafeHdc(),200,100,w,y,0,0,w,y,eight,eightinfo,DIB_RGB_COLORS,SRCCOPY);

}

void CGrayDlg::SetRGBQUAD(RGBQUAD *rgbquad)

{

inti=0;

for(i=0;i<=255;i++)

{

rgbquad[i].rgbBlue=i;

rgbquad[i].rgbGreen=i;

rgbquad[i].rgbRed=i;

rgbquad[i].rgbReserved=0;

}

}

分享到:
评论

相关推荐

    VC++将真彩色图像转换为8位图像

     VC实现真彩色图像转换为8位图像,RGB三个波段的灰度通过一个线性变换式计算为单波段灰度。  关于代码:  DWORD _width1 = WIDTHBYTES(width*8);//保存的8bits位图保存宽度  DWORD bytesCount1 = _width0*...

    24位位图转灰度图程序

    将24位真彩色位图转换为灰度图的C++程序,图片尺寸640*480。

    BMP位图文件解析

    (2) 定义灰色为图文件变量,套用灰度化公式,改变RGB值,将真彩色图像转换为灰色图像;(3) 将转换成的灰色图像存储到文件夹,然后关闭文件夹,释放内存空间。(4)由于从真菜色图到灰度图的转变之后,会产生新的...

    位图文件读写综述

    从文件中读取象素数据,用打点的方法在屏幕上显示出来,用到了搜索文件的代码。BMP位图包括24位真彩色,灰度图象,以及实现从24位真彩色图象到灰度图象的转换。

    直接读文件方式显示BMP位图

    从文件中读取象素数据,用打点的方法在屏幕上显示出来,用到了搜索文件的代码。BMP位图包括24位真彩色,灰度图象,以及实现从24位真彩色图象到灰度图象的转换。

    VB图片框显示32位真彩动态ANI图像的代码

    VB图片框显示32位真彩色动态的ANI图像的代码,原来32位真彩是用4个字节来表示一个像素的,而24位真彩用3个字节表示一个像素,但这两种真彩显示的颜色数都是2的24次方,所不同的是,32位真彩用第4个字节来描述256级...

    MFC数字图像处理(BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值)

    如果你想把彩色图片或者灰度图片二值化后在进行形态学处理,可以勾选对话框中的“二值化”选项。 值得一提的是,这个二值化是对每一层的颜色单独二值化,如果想要实现阈值效果,可以直接使用阈值功能或者转化为灰度...

    DisplayBMP_dearpmf_Vc_

    从文件中读取象素数据,用打点的方法在屏幕上显示出来,用到了搜索文件的代码。BMP位图包括24位真彩色,灰度图象,以及实现从24位真彩色图象到灰度图象的转换。

    数字图像处理

    5.2 彩色图转灰度图 85 5.3 真彩图转256色图 91 5.4 对比度扩展 100 5.5 削波 106 5.6 阈值化 107 5.7 灰度窗口变换 108 5.8 灰度直方图统计 110 5.9 灰度直方图均衡化 115 第6章 腐蚀,膨胀,细化算法 123 6.1 腐蚀...

    超强的图像处理类CDib

    //格式转换,置颜色深度为24位真彩色 void SetTo256Color(); //格式转换, 置颜色深度为256色(8位) ////////////////////////////////////////////////////////////////////////////////// #ifdef _DEBUG ...

    软件工程专题四:多媒体专题

    矢量图适于描述由多种比较规则的图形元素构成的图形,但输出图像画面时将转换成位图形式。 图形图像的主要指标有分辨率、色彩数、图形灰度。分辨率有屏幕分辨率和输出分辨率。前者用每英寸行数和列数表示,后者是以...

    Nehe的OpenGL教程电子书

    这次我们将扩展上一章的教程,并且将三角形转换成一个彩色的棱锥,把正方形变为一个实心正方体。棱锥使用混合色,正方体每个面使用一种颜色。在3D空间创建物体可能很费时间,但是所获得的结果(收获)值得这样做。...

    OPenGL编程书籍

    这次我们将扩展上一章的教程,并且将三角形转换成一个彩色的棱锥,把正方形变为一个实心正方体。棱锥使用混合色,正方体每个面使用一种颜色。在3D空间创建物体可能很费时间,但是所获得的结果(收获)值得这样做。...

Global site tag (gtag.js) - Google Analytics