用VC++处理24位真彩图转换成256级灰度图怎么弄

用VC++处理24位真彩图转换成256级灰度图怎么弄,第1张

还是先熟悉了VC++吧!

关于图像处理方面的内容建议看看:图像处理程序设计(杨淑莹)清晰版+源码

#include <windows.h>

BOOL BMP24to8(char *szSourceFile,char *szTargetFile)

int main(int argc,char* argv[])

{

//调用这个函数直接把24位真彩色灰度化

BOOL stat=BMP24to8("c://source.bmp","c://target.bmp")

return 0

}

BOOL BMP24to8(char *szSourceFile,char *szTargetFile)

{

HANDLE hSourceFile=INVALID_HANDLE_VALUE

HANDLE  hTargetFile=INVALID_HANDLE_VALUE

DWORD dwSourceSize=0,dwTargetSize=0

PBYTE pSource=NULL,pTarget=NULL

hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_READ,NULL,

OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)

if(hSourceFile==INVALID_HANDLE_VALUE)

return FALSE

dwSourceSize=GetFileSize(hSourceFile,NULL)

pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAGE_READWRITE)

//分配空间失败或者文件太小(BMP文件不可能小于54个字节)

if(pSource==NULL||dwSourceSize<=54)

{

CloseHandle(hSourceFile)

return FALSE

}

DWORD dwTemp=0

ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NULL)

BITMAPFILEHEADER *pSourceFileHeader=(BITMAPFILEHEADER*)pSource

BITMAPINFOHEADER *pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(BITMAPFILEHEADER))

//不是BMP文件或者不是24位真彩色

if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader->biBitCount!=24)

{

CloseHandle(hSourceFile)

VirtualFree(pSource,NULL,MEM_RELEASE)

return FALSE

}

CloseHandle(hSourceFile)

LONG nWidth=pSourceInfoHeader->biWidth

LONG nHeight=pSourceInfoHeader->biHeight

LONG nSourceWidth=nWidth*3

//这里是因为BMP规定保存时长度和宽度必须是4的整数倍,如果不是则要补足

if(nSourceWidth%4) 

nSourceWidth=(nSourceWidth/4+1)*4

LONG nTargetWidth=nWidth

if(nTargetWidth%4) 

nTargetWidth=(nTargetWidth/4+1)*4

dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+nHeight*nTargetWidth

pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COMMIT,PAGE_READWRITE)

memset(pTarget,0,dwTargetSize)

if(pTarget==NULL)

{

VirtualFree(pTarget,NULL,MEM_RELEASE)

return FALSE

}

BITMAPFILEHEADER *pTargetFileHeader=(BITMAPFILEHEADER *)pTarget

BITMAPINFOHEADER *pTargetInfoHeader =

(BITMAPINFOHEADER *)(pTarget+sizeof(BITMAPFILEHEADER))

pTargetFileHeader->bfType=pSourceFileHeader->bfType

pTargetFileHeader->bfSize=dwTargetSize

pTargetFileHeader->bfReserved1=0

pTargetFileHeader->bfReserved2=0

pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256

pTargetInfoHeader->biBitCount=8

pTargetInfoHeader->biClrImportant=0

pTargetInfoHeader->biClrUsed=256

pTargetInfoHeader->biCompression=BI_RGB

pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeight

pTargetInfoHeader->biPlanes=1

pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER)

pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth

pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidth

pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter

pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter

RGBQUAD *pRgb

for(int i=0i<256i++)//初始化8位灰度图的调色板信息

{

pRgb = (RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD))

pRgb->rgbBlue=i

pRgb->rgbGreen=i

pRgb->rgbRed=i

pRgb->rgbReserved=0

}

for (int m=0m<nHeightm++)//转化真彩色图为灰度图

{

for(int n=0n<nWidthn++)

{

pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n] =

pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3]*0.114

+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+1]*0.587

+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+2]*0.299

}

}

hTargetFile = CreateFile(szTargetFile,GENERIC_WRITE,FILE_SHARE_WRITE,

NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)

BOOL stat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL)

CloseHandle(hTargetFile)

VirtualFree(pSource,NULL,MEM_RELEASE)

VirtualFree(pTarget,NULL,MEM_RELEASE)

return stat

}

新华书店文轩上搜索到一本书,供你参考

VC++图像处理程序设计

作者:杨淑莹 编著

出版:北京交大 出版日期:2010年04月

本书介绍了各种数字图像处理的算法及编程实现技术。全书由13章和一个附录组成。主要内容包括:位图基础、图像的显示、图像的几何变换、图像灰度变换、图像的平滑处理、图像锐化处理及边缘检测、图像分割及测量、图像的形态处理学、图像的变换域处理及应用、图像的合成、24位彩色图像的处理、图像的小波变换和JPEG图像的压缩编码。 本书介绍了近90种图像处理的技术,这些技术与编程实例相结合,提供了VC++编程步骤,图像处理的编程代码,并且处理前的图像可与处理之后的图像对照比较。实例程序的框架结构简单,代码简

教育部特色专业bai建设点(4个):计算机科du学与技术、材料物理、zhi机械工程dao、工程造价;

教育部“本科教学工程”专业综合改革试点专业(1个):自动化;

教育部卓越工程师教育培养计划专业(5个):材料成型及控制工程、自动化、电气工程及其自动化、电子信息工程、信息安全;

国家级实验教学示范中心(1个):机电工程实验教学中心[8]

国家级工程实践教育中心(3个):北京中软国际信息技术有限公司、天津灯塔涂料有限公司、天津第一机床总厂

国家精品课程(1门):工程计价学

国家级精品资源共享课(2门):《工程计价学》(尹贻林)、《数字图像处理》(杨淑莹)

天津市级实验教学示范中心建设单位(5个):物理实验中心、计算机实验教学中心、机械基础实验中心、电气信息实验中心、材料科学与工程实验教学中心

天津市“十二五”综投品牌专业建设项目(13个):通信工程、集成电路设计与集成系统、信息安全、制药工程、工业设计、安全工程、材料成型及控制工程、自动化、机械工程及自动化、计算机科学与技术、材料物理、工程造价、热能与动力工程;

天津市“十二五”综投战略性新兴产业相关专业建设项目(5个):物联网工程、功能材料、新能源科学与工程、资源循环科学与工程、机械电子工程(汽车电子工程方向);

天津市市级专业综合改革试点(2个):自动化、工程造价;

天津市市级卓越工程师教育培养计划试点专业(14个):材料成型及控制工程、自动化、计算机科学与技术、机械工程及自动化、电子信息工程、信息安全、应用化学、化学工程与工艺、环境工程、安全工程、航海技术、轮机工程、材料科学与工程、集成电路设计与集成系统。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7744723.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存