将各种格式的图像转换为灰度图像
来源:互联网 发布:西安明朝万达 JAVA 编辑:程序博客网 时间:2024/06/06 21:39
接着上一篇的程序。下面的一个功能是利用FreeImage将各种格式的图像转换为灰度图像。
方法一:自己写转换函数;
下面的代码就是将各种编码格式的图像转化为灰度图像的处理函数:
FIBITMAP* CGenricImageTransformerView::TransformToGrayscale(FIBITMAP *dib) { const int nBitCounts = 8; int nBpp = FreeImage_GetBPP(dib); BYTE* imgData = FreeImage_GetBits(dib); int width = FreeImage_GetWidth(dib); int height = FreeImage_GetHeight(dib); FIBITMAP* fiBmp = FreeImage_Allocate(width,height,nBitCounts); RGBQUAD* pRGBTable = FreeImage_GetPalette(fiBmp); //创建灰度索引调色板 for (int i = 0;i<256;i++) { pRGBTable[i].rgbBlue = i; pRGBTable[i].rgbGreen = i; pRGBTable[i].rgbRed = i; } BYTE nIntensity; int j,k; switch(nBpp) { case 32: //32位图(带alpha通道)转换为8位灰度图 for(j=0;j<height;j++) { for(k=0;k<4*width;k++) { nIntensity = (BYTE)(0.299*imgData[j*4*width+k]+ 0.587*imgData[j*4*width+k+1]+0.114*imgData[j*4*width+k+2]); if(k%4) FreeImage_SetPixelIndex(fiBmp,k/4,j,&nIntensity); } } return fiBmp; break; case 24: //24位图像转为8位灰度图 for(j=0;j<height;j++) { for(k=0;k<3*width;k++) { nIntensity = (BYTE)(0.299*imgData[j*3*width+k]+ 0.587*imgData[j*3*width+k+1]+0.114*imgData[j*3*width+k+2]); if(k%3) FreeImage_SetPixelIndex(fiBmp,k/3,j,&nIntensity); } } return fiBmp; break; case 8: //8位伪彩色转为8位灰度图 for(j=0;j<height;j++) { for(k=0;k<width;k++) { FreeImage_GetPixelIndex(dib,k,j,&nIntensity); RGBQUAD* ptrRGB = FreeImage_GetPalette(dib); nIntensity = (BYTE)(0.299*ptrRGB[nIntensity].rgbRed+ 0.587*ptrRGB[nIntensity].rgbGreen+0.114*ptrRGB[nIntensity].rgbBlue); FreeImage_SetPixelIndex(fiBmp,k,j,&nIntensity); } } return fiBmp; break; default: break; } return NULL;
在菜单栏中新建一个菜单项,设置标签为:转换为灰度图像,并添加命令处理函数:
void CGenricImageTransformerView::OnTransformToGrayscale() { // TODO: Add your command handler code here FIBITMAP* fiBitmap = TransformToGrayscale(dib); CFileDialog fileDlg(FALSE,".bmp","img.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "bmp(*.bmp)|*.bmp|jpg(*.jpg)|*.jpg|/ tif(*.tif)|*.tif|png(*.png)|*.png|/ gif(*.gif)|*.gif|Any(*.*)|*.*||", NULL); if(IDOK == fileDlg.DoModal()) { CString filename = fileDlg.GetFileName(); BOOL bSuccess = GenericWriter(fiBitmap,filename); if(!bSuccess) MessageBox("Not support that type!");
方法二:直接调用FreeImage库中已经定义好的转换函数:
void CGenricImageTransformerView::OnTransformToGrayscale() { // TODO: Add your command handler code here FIBITMAP* fiBitmap =FreeImage_ConvertToGrayscale(dib);//这里调用FreeImage库中的转换为灰度的函数 CFileDialog fileDlg(FALSE,".bmp","img.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "bmp(*.bmp)|*.bmp|jpg(*.jpg)|*.jpg|/ tif(*.tif)|*.tif|png(*.png)|*.png|/ gif(*.gif)|*.gif|Any(*.*)|*.*||", NULL); if(IDOK == fileDlg.DoModal()) { CString filename = fileDlg.GetFileName(); BOOL bSuccess = GenericWriter(fiBitmap,filename); if(!bSuccess) MessageBox("Not support that type!"); } }
用起来也特别方便,除此之外,FreeImage提供了其他的转换函数,可以转换为4位、8位、16位、24位、32位等图像类型。
原文地址:http://blog.csdn.net/summersolstice/article/details/5161859
0 0
- 将各种格式的图像转换为灰度图像
- 将各种格式的图像转换为灰度图像
- C#将RGB图像转换为8位灰度图像
- C#将RGB图像转换为8位灰度图像
- vc将彩色图像转换为灰度图像
- 【Matlab】将彩色图像转换为灰度图像
- C#将RGB图像转换为8位灰度图像
- 灰度图像转换为彩色
- 将bmp图像转换为ppm格式
- 彩色图像转换为灰度图像
- openCV彩色图像转换为灰度图像
- 彩色图像批量转换为灰度图像
- Matlab读取图像,并将该图像转换为灰度图像
- 各种图像的格式与转换
- C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
- 使用 Java 进行图像处理 - 将彩色图像转换为灰度图
- 使用GDI+将24位真彩色图像转换为8位灰度图像
- 数字图像处理——用Java将彩色图像转换为灰度图像
- leetcode刷题日记——Add Digits
- android原生代码中的情景模式及提示音和通知
- LeetCode OJ : 5 Longest Palindromic Substring
- 从Java中堆内存和栈内存分配中详谈String使用equals和==比较的区别
- Scala List基本操作
- 将各种格式的图像转换为灰度图像
- leetcode:225 Implement Stack using Queues-每日编程第二十六题
- linux中报错:undefined reference to
- Mapreduce工作流程
- Spring scope属性详解
- apscheduler提示maximum错误
- DefaultHttpClient is deprecated
- hdu 2086 A1 = ?
- jenkins通过配置ansible传输文件,并且调度服务