MFC中封存图片
MFC中保存图片
我在Picture中放入一张图片,不一定是.bmp类型的,然后对这个图片进行修改,比如在图片上画了一个矩形,然后想保存这个图片。就像Windows自带画板中的“另存为”的类似功能。
我有用过这个
CRect TPrect;
GetDlgItem(IDC_IMAGE)->GetClientRect(&TPrect); //Picture控件的矩形大小
HBITMAP hbitmap=CreateCompatibleBitmap(dc->m_hDC,m_Lwidth,m_Lhight);
HDC hdc=CreateCompatibleDC(dc->m_hDC);
HBITMAP hOldMap=(HBITMAP)SelectObject(hdc,hbitmap);
StretchBlt(hdc,0,0,m_Lwidth,m_Lhight,dc->m_hDC,0,0,TPrect.Width(),TPrect.Height(),SRCCOPY); //将原始设备描述表的颜色表及像素数据块复制到兼容设备描述表中
CImage image;
image.Attach(hbitmap);
CString FilePath;
FilePath=m_StrArray[m_Index];
FilePath=FilePath.Left(FilePath.Find('.'));
FilePath+=_T(".jpg");
HRESULT hResult = image.Save(FilePath);
if (FAILED(hResult))
{
MessageBox(_T("保存图像文件失败!"));
}
image.Detach();
SelectObject(hdc,hOldMap);
但是所得的图片失真了,像素倒是不变的。。。希望有人帮忙,怎么改。。。。或者另外的实现保存的代码或可用的函数,,谢谢。。。
------解决方案--------------------
StretchBlt会导致失真,建议换BitBlt试一下
另外保存为JPG也会失真,不想失真最好保存为BMP
------解决方案--------------------
如果你一定要用StretchBlt可以用如下代码试试,看会不会失真。
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(...);
------解决方案--------------------
CImage保存jpg就是会失真
jpg是有压缩比的
以前我用的使用也没有仔细研究这个问题
你用GDI+存一下试试
------解决方案--------------------
GDI+可以实现文件存储
http://www.yesky.com/SoftChannel/72342371928702976/20040717/1831984.shtml
------解决方案--------------------
所谓举一反三么
你说的没错
例子讲的确实是从文件到文件
但是具体过程是不是这样的
读文件
提取数据流
存储数据流
也就是说你要你能获取到想要保存数据流就可以实现保存文件
至于数据流怎么来的
那就是你自己的事了
可以从文件来
也可以自己做出来
我就提到这吧
只是一个思路
如果你觉得不合适
那还是按着你熟悉的方法来吧
祝你好运
------解决方案--------------------
我估计他是少了个+号,他的意思是果断使用GDI+
我在Picture中放入一张图片,不一定是.bmp类型的,然后对这个图片进行修改,比如在图片上画了一个矩形,然后想保存这个图片。就像Windows自带画板中的“另存为”的类似功能。
我有用过这个
CRect TPrect;
GetDlgItem(IDC_IMAGE)->GetClientRect(&TPrect); //Picture控件的矩形大小
HBITMAP hbitmap=CreateCompatibleBitmap(dc->m_hDC,m_Lwidth,m_Lhight);
HDC hdc=CreateCompatibleDC(dc->m_hDC);
HBITMAP hOldMap=(HBITMAP)SelectObject(hdc,hbitmap);
StretchBlt(hdc,0,0,m_Lwidth,m_Lhight,dc->m_hDC,0,0,TPrect.Width(),TPrect.Height(),SRCCOPY); //将原始设备描述表的颜色表及像素数据块复制到兼容设备描述表中
CImage image;
image.Attach(hbitmap);
CString FilePath;
FilePath=m_StrArray[m_Index];
FilePath=FilePath.Left(FilePath.Find('.'));
FilePath+=_T(".jpg");
HRESULT hResult = image.Save(FilePath);
if (FAILED(hResult))
{
MessageBox(_T("保存图像文件失败!"));
}
image.Detach();
SelectObject(hdc,hOldMap);
但是所得的图片失真了,像素倒是不变的。。。希望有人帮忙,怎么改。。。。或者另外的实现保存的代码或可用的函数,,谢谢。。。
------解决方案--------------------
StretchBlt会导致失真,建议换BitBlt试一下
另外保存为JPG也会失真,不想失真最好保存为BMP
------解决方案--------------------
如果你一定要用StretchBlt可以用如下代码试试,看会不会失真。
SetStretchBltMode(hdc,HALFTONE);
StretchBlt(...);
------解决方案--------------------
CImage保存jpg就是会失真
jpg是有压缩比的
以前我用的使用也没有仔细研究这个问题
你用GDI+存一下试试
------解决方案--------------------
GDI+可以实现文件存储
http://www.yesky.com/SoftChannel/72342371928702976/20040717/1831984.shtml
------解决方案--------------------
所谓举一反三么
你说的没错
例子讲的确实是从文件到文件
但是具体过程是不是这样的
读文件
提取数据流
存储数据流
也就是说你要你能获取到想要保存数据流就可以实现保存文件
至于数据流怎么来的
那就是你自己的事了
可以从文件来
也可以自己做出来
我就提到这吧
只是一个思路
如果你觉得不合适
那还是按着你熟悉的方法来吧
祝你好运
------解决方案--------------------
我估计他是少了个+号,他的意思是果断使用GDI+