读取CImage图像像素矩阵时总是读取访问权限冲突异常怎么回事 5
CImageimggray;imggray.Load(path);BYTE*pRealData;pRealData=(BYTE*)imggray.GetBits();//...
CImage imggray;
imggray.Load(path);
BYTE* pRealData;
pRealData = (BYTE*)imggray.GetBits(); //获取到图片内存点的位置
int pit = imggray.GetPitch(); //图像每行字节数
int bitCount = imggray.GetBPP() / 8; //获取每像素的位数~~/8得到字节数
int height = imggray.GetHeight();
int width = imggray.GetWidth();
int **a = new int*[height];
for (int i = 0; i < height; i++)
{
a[i] = new int[width];
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
BYTE b= *(pRealData + pit*i + j*bitCount + 0);
BYTE g= *(pRealData + pit*i + j*bitCount + 1);
BYTE r= *(pRealData + pit*i + j*bitCount + 2);
BYTE gray= (BYTE)round(r*0.299 + g * 0.587 + b * 0.114);
a[i][j] = gray;
}
}
读取访问权限冲突异常:BYTE b= *(pRealData + pit*i + j*bitCount + 0);
BYTE g= *(pRealData + pit*i + j*bitCount + 1);
BYTE r= *(pRealData + pit*i + j*bitCount + 2);
BYTE gray= (BYTE)round(r*0.299 + g * 0.587 + b * 0.114);这里的代码有问题,求大佬们解答 展开
imggray.Load(path);
BYTE* pRealData;
pRealData = (BYTE*)imggray.GetBits(); //获取到图片内存点的位置
int pit = imggray.GetPitch(); //图像每行字节数
int bitCount = imggray.GetBPP() / 8; //获取每像素的位数~~/8得到字节数
int height = imggray.GetHeight();
int width = imggray.GetWidth();
int **a = new int*[height];
for (int i = 0; i < height; i++)
{
a[i] = new int[width];
}
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
BYTE b= *(pRealData + pit*i + j*bitCount + 0);
BYTE g= *(pRealData + pit*i + j*bitCount + 1);
BYTE r= *(pRealData + pit*i + j*bitCount + 2);
BYTE gray= (BYTE)round(r*0.299 + g * 0.587 + b * 0.114);
a[i][j] = gray;
}
}
读取访问权限冲突异常:BYTE b= *(pRealData + pit*i + j*bitCount + 0);
BYTE g= *(pRealData + pit*i + j*bitCount + 1);
BYTE r= *(pRealData + pit*i + j*bitCount + 2);
BYTE gray= (BYTE)round(r*0.299 + g * 0.587 + b * 0.114);这里的代码有问题,求大佬们解答 展开
1个回答
展开全部
CImage类是ATL和MFC共用的一个类,其头文件为atlimage.h,主要用于图片文件的打开,显示与保存。这里需要注意的是,在VS2010和VS2012的MFC编程中,不需要将头文件包含进来。MFC中要使用CImage类,必须先将头文件包含进来,可以包含在当前代码的CPP文件中,也可以包含在所属类的头文件中,不过最好还是包含在工程的stdafx.h文件中。CImage总共有39个成员函数。
外文名
cimage
头文件
atlimage.h
主要作用
图片文件的打开,显示与保存
简介
ATL和MFC共用的一个类
行为
保存图片
保存图片只有一个函数,就是Save函数,该函数有两个参数,一个是文件的完整路径和文件名,一个是文件的扩展名。但是如果只有保存和显示图片功能,CImage的Save函数发挥不了太大的作用,不过是一个转存文件的工具。CImage的强大之处在于可以对图片进行修改,再进行保存。
修改图片的函数有这么3个函数可以修改图片,都是像素级的操作。这三个函数分别为SetPixel,SetPixelRGB,SetPixelIndexed。可以通过双重循环对屏幕进行逐点扫描,并把像素颜色值保存到CImage对象中达到截屏的目的。
我们可以用一段很简单的代码来实现将DC(设备上下文)里绘制的图形存入图片文件中。基本的思想是先初始化一个CImage对象,再为它设定大小和位数,也就是图片大小和图片的色彩总数,再用设备上下文绘图。绘制完图形后再建立另外一个设备上下文对象,称为目的DC,将之前绘图的DC称为源DC,目的DC必须与CImage对象关联起来,然后利用BitBlt函数和其他函数将绘图DC的内容拷贝到目的DC中,最后将CImage对象保存到文件中,以下是代码实现(VS2010支持中文变量名):
CRect rect;
this->GetClientRect(rect);
CImage image;
image.Create(rect.Width(),rect.Height(),24);
CDC* DCpoint=this->GetDC();
DCpoint->Ellipse(20,20,200,200);
CDC dstDC;
dstDC.CreateCompatibleDC(DCpoint);
dstDC.SelectObject(image);
dstDC.BitBlt(0,0,rect.Width(),rect.Height(),DCpoint,0,0,SRCCOPY);
image.Save(L"D:\\用户目录\\Pictures\\写图片文件.jpg");
显示图片
首先看下面这段代码
CImage image;
image.Load(L"D:\\用户目录\\Pictures\\example.jpg");
image.Draw(GetDC()->m_hDC,CRect(0,0,320,240));
CImage类支持以Load方法读取本地磁盘上的文件,并用Draw方法来显示图片。CIamge类的成员函数中还有很多可以实现显示图片。例如BitBlt办法。如以下代码:
image.BitBlt(GetDC()->m_hDC,0,0,320,240,0,0,SRCCOPY);
Bitblt方法同CDC类的Bitblt函数一样,是一比一地复制图像并显示在屏幕上,支持对源图像取反,也就是反色显示。这样功能通过BitBlt的最后一个参数来实现,比如参数为NOTSRCCOPY就是反色显示。
MaskBlt可以将图片与目的图片进行特殊的光栅操作并进行掩码处理。
PlgBlt函数可以将图片拉伸成平行四边形进行显示。
StretchBlt函数可以将图片进行拉伸显示。
外文名
cimage
头文件
atlimage.h
主要作用
图片文件的打开,显示与保存
简介
ATL和MFC共用的一个类
行为
保存图片
保存图片只有一个函数,就是Save函数,该函数有两个参数,一个是文件的完整路径和文件名,一个是文件的扩展名。但是如果只有保存和显示图片功能,CImage的Save函数发挥不了太大的作用,不过是一个转存文件的工具。CImage的强大之处在于可以对图片进行修改,再进行保存。
修改图片的函数有这么3个函数可以修改图片,都是像素级的操作。这三个函数分别为SetPixel,SetPixelRGB,SetPixelIndexed。可以通过双重循环对屏幕进行逐点扫描,并把像素颜色值保存到CImage对象中达到截屏的目的。
我们可以用一段很简单的代码来实现将DC(设备上下文)里绘制的图形存入图片文件中。基本的思想是先初始化一个CImage对象,再为它设定大小和位数,也就是图片大小和图片的色彩总数,再用设备上下文绘图。绘制完图形后再建立另外一个设备上下文对象,称为目的DC,将之前绘图的DC称为源DC,目的DC必须与CImage对象关联起来,然后利用BitBlt函数和其他函数将绘图DC的内容拷贝到目的DC中,最后将CImage对象保存到文件中,以下是代码实现(VS2010支持中文变量名):
CRect rect;
this->GetClientRect(rect);
CImage image;
image.Create(rect.Width(),rect.Height(),24);
CDC* DCpoint=this->GetDC();
DCpoint->Ellipse(20,20,200,200);
CDC dstDC;
dstDC.CreateCompatibleDC(DCpoint);
dstDC.SelectObject(image);
dstDC.BitBlt(0,0,rect.Width(),rect.Height(),DCpoint,0,0,SRCCOPY);
image.Save(L"D:\\用户目录\\Pictures\\写图片文件.jpg");
显示图片
首先看下面这段代码
CImage image;
image.Load(L"D:\\用户目录\\Pictures\\example.jpg");
image.Draw(GetDC()->m_hDC,CRect(0,0,320,240));
CImage类支持以Load方法读取本地磁盘上的文件,并用Draw方法来显示图片。CIamge类的成员函数中还有很多可以实现显示图片。例如BitBlt办法。如以下代码:
image.BitBlt(GetDC()->m_hDC,0,0,320,240,0,0,SRCCOPY);
Bitblt方法同CDC类的Bitblt函数一样,是一比一地复制图像并显示在屏幕上,支持对源图像取反,也就是反色显示。这样功能通过BitBlt的最后一个参数来实现,比如参数为NOTSRCCOPY就是反色显示。
MaskBlt可以将图片与目的图片进行特殊的光栅操作并进行掩码处理。
PlgBlt函数可以将图片拉伸成平行四边形进行显示。
StretchBlt函数可以将图片进行拉伸显示。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询