各位,有没有将bmp转换为wmf的函数或方法? 搜了一下旧贴子没有太好的办法!解决后即结贴! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用img.Save(@"c:\1.wmf");就可以吗? 下面没有用GDI+,用的GDI,代码测试通过HDC hdc = CreateMetaFile("c:\\test.wmf"); HBITMAP hbmp = (HBITMAP)::LoadImage(NULL,"c:\\te12.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); CDC memdc; memdc.CreateCompatibleDC(GetDC()); HBITMAP hold = (HBITMAP)memdc.SelectObject(hbmp); BITMAP bmp; ::GetObject(hbmp,sizeof(bmp),&bmp); if(hbmp != NULL) { BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,memdc.m_hDC,0,0,SRCCOPY); } memdc.SelectObject(hold); memdc.DeleteDC(); CloseMetaFile(hdc); 两篇文章:中文的:http://www.cppblog.com/TechLab/archive/2005/11/25/1302.aspx英文的:http://www.codeproject.com/vcpp/gdiplus/saveasemfexiwmf.asp 从MSDN上可以看到用GDI+的Image::Save方法可以很容易的实现把图片保存为BMP、GIF、TIFF、PNG、JPEG格式。虽然GDI+的Metafile类给了我们读取EMF、WMF格式图片方便,但是这个类没有直接提供保存的方法来写EMF、EXIF、WMF文件。这里介绍另外一种巧妙的写方法。 先用GDI+的Bitmap类建立一个对象,所有的画图操作完成之后形成一个Bitmap位图。然后传入一个需要保存的EMF等文件的路径。用空的文件路径构造一个Metafile对象,再用Metafile对象构造一个Graphics画图对象,最后把源位图用DrawImage画出来即可。这里的目标画图DC实际上就是用EMF文件。Bitmap m_Bitmap; //已经画好的位图对象,或者之间用位图文件构造USES_CONVERSION; //提供A2W宏字符串转换sFileName = "c:\\test.emf"; //目标的EMF文件路径Metafile metafile(A2W(sFileName),cdc->m_hDC, EmfTypeEmfPlusDual,NULL);Graphics graphics(&metafile);graphics.DrawImage(&bmp, 0, 0, bmp.GetWidth(), bmp.GetHeight());这段程序如果用c#来写,应该怎么写? s5689412(华君) 你好!我用Gdi+生成一副bmp图然后用img.Save()存为wmf格式后用freehad打开wmf图,缩放后会有失真现象,但是用freehand生成的wmf图缩放后就没有失真现象,是为什么呢? sorry,我对WMF文件的内部格式不太了解,只是提供给你在.NET下转化的方法,我猜想,也许是freehand为了更好的支持向量格式,在它保存的文件中有更多的向量计算所用的内容,而.NET没有。你看看两幅相同的图片,是否freehand保存的大小较大?如果是的话,那就应证了我的猜想,如果不是,那就是我的猜想错了。^_^个人猜想,仅供参考。 s5689412(华君)你好,谢谢你回答:以下这段代码能改成c#的吗?Bitmap m_Bitmap; //已经画好的位图对象,或者之间用位图文件构造USES_CONVERSION; //提供A2W宏字符串转换sFileName = "c:\\test.emf"; //目标的EMF文件路径Metafile metafile(A2W(sFileName),cdc->m_hDC, EmfTypeEmfPlusDual,NULL);Graphics graphics(&metafile);graphics.DrawImage(&bmp, 0, 0, bmp.GetWidth(), bmp.GetHeight()); 类似于这样: Image im = Image.FromFile(@"c:\snapshot20060112143826.jpg"); Graphics srcg = Graphics.FromImage(im) ; IntPtr srcPtr = srcg.GetHdc(); Metafile metafile = new Metafile(@"C:\test.emf", srcPtr, EmfType.EmfPlusDual); Graphics g = Graphics.FromImage(metafile); g.DrawImage(im, 0, 0); 注意释放对象,紧接着上面的代码: srcg.ReleaseHdc(srcPtr); g.Dispose(); metafile.Dispose(); im.Dispose(); srcg.Dispose(); 我用Gdi+生成一副bmp图然后用img.Save()存为wmf格式后用freehad打开wmf图,缩放后会有失真现象,但是用freehand生成的wmf图缩放后就没有失真现象,是为什么呢?==============================将bmp转换为wmf,其实已经失去了图中的矢量信息(只有点阵),放大后当然会失真。freehand生成的wmf中保存的是真正的矢量信息,所以不会失真。 runrunrun(一条不会游泳の鱼) ,那怎么办,有什么好的办法吗? 关于datagridView标题栏上加上一个checkbox 关于c#使用第三方提供wsdl文件的问题 小弟想做个论坛,请各位大侠们指点指点 反射中这两种方式有区别吗? 将DropDownList控件的SelectedValue值设置为一个从数据库取出的值 有关 ArrayList 的小问题,会的进来看看啊! CSharp combobox的问题 怎么样判断子窗体的焦点阿? 各位大佬,netcore3.0到底支持不支持调用remoting接口啊,求救。 菜鸟提问 关于c#woindows应用程序 在winform里c#验证用户正确后 怎么打开新窗口时关闭登陆窗口
就可以吗?
HBITMAP hbmp = (HBITMAP)::LoadImage(NULL,"c:\\te12.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CDC memdc;
memdc.CreateCompatibleDC(GetDC());
HBITMAP hold = (HBITMAP)memdc.SelectObject(hbmp);
BITMAP bmp;
::GetObject(hbmp,sizeof(bmp),&bmp);
if(hbmp != NULL)
{
BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,memdc.m_hDC,0,0,SRCCOPY);
}
memdc.SelectObject(hold);
memdc.DeleteDC();
CloseMetaFile(hdc);
http://www.cppblog.com/TechLab/archive/2005/11/25/1302.aspx英文的:
http://www.codeproject.com/vcpp/gdiplus/saveasemfexiwmf.asp
先用GDI+的Bitmap类建立一个对象,所有的画图操作完成之后形成一个Bitmap位图。然后传入一个需要保存的EMF等文件的路径。用空的文件路径构造一个Metafile对象,再用Metafile对象构造一个Graphics画图对象,最后把源位图用DrawImage画出来即可。这里的目标画图DC实际上就是用EMF文件。
Bitmap m_Bitmap; //已经画好的位图对象,或者之间用位图文件构造
USES_CONVERSION; //提供A2W宏字符串转换
sFileName = "c:\\test.emf"; //目标的EMF文件路径
Metafile metafile(A2W(sFileName),cdc->m_hDC, EmfTypeEmfPlusDual,NULL);
Graphics graphics(&metafile);
graphics.DrawImage(&bmp, 0, 0, bmp.GetWidth(), bmp.GetHeight());这段程序如果用c#来写,应该怎么写?
我用Gdi+生成一副bmp图然后用img.Save()存为wmf格式后用freehad打开wmf图,缩放后会有失真现象,但是用freehand生成的wmf图缩放后就没有失真现象,是为什么呢?
以下这段代码能改成c#的吗?
Bitmap m_Bitmap; //已经画好的位图对象,或者之间用位图文件构造
USES_CONVERSION; //提供A2W宏字符串转换
sFileName = "c:\\test.emf"; //目标的EMF文件路径
Metafile metafile(A2W(sFileName),cdc->m_hDC, EmfTypeEmfPlusDual,NULL);
Graphics graphics(&metafile);
graphics.DrawImage(&bmp, 0, 0, bmp.GetWidth(), bmp.GetHeight());
Graphics srcg = Graphics.FromImage(im) ;
IntPtr srcPtr = srcg.GetHdc(); Metafile metafile = new Metafile(@"C:\test.emf", srcPtr, EmfType.EmfPlusDual);
Graphics g = Graphics.FromImage(metafile);
g.DrawImage(im, 0, 0);
srcg.ReleaseHdc(srcPtr);
g.Dispose();
metafile.Dispose();
im.Dispose();
srcg.Dispose();
freehand生成的wmf中保存的是真正的矢量信息,所以不会失真。