CImage 访问像素点 像素数据操作
来源:互联网 发布:淘宝商城网店怎么开 编辑:程序博客网 时间:2024/05/01 00:51
在CImage类的像素访问
MSDN的代码
COLORREF pixel; int maxY = imgOriginal.GetHeight(), maxX = imgOriginal.GetWidth(); byte r,g,b,avg; for (int y=0; y<maxY; y++) { for (int x=0; x<maxX; x++) { pixel = imgOriginal.GetPixel(x,y); r = GetRValue(pixel); g = GetGValue(pixel); b = GetBValue(pixel); avg = (r+ g+ b)/3; imgOriginal.SetPixelRGB(x,y,avg,avg,avg);}}
这种方式效率很低, 因为每次调用getpixel,都包含着程序的进栈和出栈。所以,面对大量需要处理的数据,采用直接访问内存地址的方法。
byte* pRealData; pRealData=(byte*)imgOriginal.GetBits(); int pit=imgOriginal.GetPitch(); int bitCount=imgOriginal.GetBPP()/8; for (int y=0; y<maxY; y++) { for (int x=0; x<maxX; x++) {int grayVal=(int)(int)(*(pRealData + pit*y + x*bitCount))*0.3 + (int)(int)(*(pRealData + pit*y + x*bitCount +1))*0.59 + (int)(int)(*(pRealData + pit*y + x*bitCount +2))*0.11; *(pRealData + pit*y + x*bitCount)=grayVal; *(pRealData + pit*y + x*bitCount +1)=grayVal; *(pRealData + pit*y + x*bitCount +2)=grayVal;//如果是8位灰度图像,直接读取一个BYTE位为灰度值//如果是24位RGB图像,则依次读取pixAddr,pixAddr+1,pixAddr+2为B、G、R分量值}}
用两种方法对同一张图片(3264*2448像素)进行处理,前者需要1分钟,后者只需1秒左右。
所以,后者比前者至少快60倍。
还有一种处理方式
//真彩色图像变为灰度图,直接修改像素点的值
void PixelsChangedToGray(CImage *pImage){ intnByte,j,i,nWidth,nHeight,nBytesPerPixel;BYTE*pPixelLine,cNewPixelValue;nWidth=pImage->GetWidth();nHeight=pImage->GetHeight();nBytesPerPixel= pImage->GetBPP()/8;for (i=0;i<nHeight;i++){ pPixelLine =(BYTE*) pImage->GetPixelAddress(0,i); nByte=0; for (j=0;j<nWidth;j++){ cNewPixelValue=(BYTE)(0.11*pPixelLine[nByte] +0.59*pPixelLine[nByte+1] +0.30*pPixelLine[nByte+2]);pPixelLine[nByte] = pPixelLine[nByte+1] = pPixelLine[nByte+2] = cNewPixelValue;nByte+=nBytesPerPixel; } }}
//非真彩色图像变为灰度图,修改调色板信息
void PaletteChangedToGray(CImage *pImage){ RGBQUADColorTabs[256]; inti,nColorTableEntries,nNewGrayColor;nColorTableEntries=pImage->GetMaxColorTableEntries(); pImage->GetColorTable(0,nColorTableEntries,ColorTabs);for (i=0;i<nColorTableEntries;i++){ nNewGrayColor=(int)(0.11*ColorTabs[i].rgbBlue + 0.59*ColorTabs[i].rgbGreen + 0.30*ColorTabs[i].rgbRed); ColorTabs[i].rgbBlue = (BYTE)nNewGrayColor; ColorTabs[i].rgbGreen = (BYTE)nNewGrayColor; ColorTabs[i].rgbRed = (BYTE)nNewGrayColor; }pImage->SetColorTable(0,nColorTableEntries,ColorTabs);}
- CImage 访问像素点 像素数据操作
- MFC中CImage类的像素访问
- OpenCV 访问图像像素点
- Opencv访问像素点方法
- opencv 访问每个像素点
- 如何直接访问CImage地址获取对应像素颜色
- 图像的像素点操作
- MFC CImage 读取图像 像素
- 访问像素
- 像素访问
- 像素操作
- 操作像素
- 像素操作
- Opencv2--像素点操作(加噪声)
- Python-OpenCV图像像素点操作
- Opencv像素点操作--图像加减
- opencv通过指针访问像素数据
- OpenCV像素点邻域遍历效率比较,以及访问像素点的几种方法
- 找不到mysql.h头文件"问题解
- 随便来点,不知道为什么
- 墨菲定律、二八法则、马太效应、手表定理、“不值得”定律、彼得原理、零和游戏、华盛顿合作规律、酒与污水定律、水桶定律、蘑菇管理原理、钱的问题、奥卡姆剃刀等13条是左右人生的金科玉律
- Asp.Net MVC2 实用入门系列:第二篇:第一个页面
- 下载的java package如何导入eclipse
- CImage 访问像素点 像素数据操作
- treeview 树形结构的经典解说
- ADO.NET基础琐碎总结-----参数化查询
- Asp.Net MVC2 实用入门系列:第三篇:ASP.NET MVC全局观
- linux中运行脚本与设置环境变量
- c++中的补零
- LeetCode: Reverse Linked List II
- 在柱状图中找最大矩形——O(n)时间复杂度java实现
- Asp.Net MVC2 实用入门系列:第四篇:传递表单数据