gdi+从文件读入图片再保存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdi+从文件读入图片再保存相关的知识,希望对你有一定的参考价值。
vc 6.0 gdi+我弄好了,可以用gdi+实现图片的格式转换(确保gdi+什么的是引用正常的)。
那如何将一个图片选入dc,然后把这个dc保存为图片呢?
大约是这样的代码:
HDC imgdc=CreateCompatibleDC(NULL);
Gdiplus::Image *image=Image::FromFile(路径);
SelectObject(imgdc,image);
Bitmap bmpx(image->GetWidth(),image->GetHeight());
Graphics g(&bmpx);
HDC hdcx=g.GetHDC();
BitBlt(hdcx,0,0,image->GetWidth(),image->GetHeight(),imgdc,0,0,SRCCOPY);
CLSID encoderClsid;
GetEncoderClsid(L"image/jpeg", &encoderClsid);
bmpx.Save(L"d:\\55.jpg", &encoderClsid);
生成的文件,长宽和原来的一致,但是图片内容就是纯黑,什么都没有。这到底应该怎么写呢?
GDI+画图是需要一个Graphic对象的,
读取到的Image对象,
初始化一个Graphic对象,
然后用这个Graphic对象画图。
第一种:用内存流去存储。
using(MemoryStream ms = new MemoryStream())
image.Save(ms, ImageFormat.Jpeg);//图片保存格式
image.save(filepath);//图片保存地址
ms.dispose();//清空内存
image.Dispose();//清空图片缓存
第二种:将内存流转换为字节数组保存,效率更高
using(MemoryStream ms=new MemoryStream())
image.Save(ms, ImageFormat.Jpeg);
byte[] Imgs = ms.ToArray();
ms.Dispose();
image.Dispose();
System.IO.File.WriteAllBytes(filepath, Imgs);
据我所知,对内存DC选入位图,只有位图跟DC兼容才有效
兼容是指位图是单色位图0和1 或者位图的位数与DC一样
可能是这个原因本回答被提问者采纳
以上是关于gdi+从文件读入图片再保存的主要内容,如果未能解决你的问题,请参考以下文章
VC++使用GDI+实现HBITMAP与图片文件之间的相互转换(附源码)