如何在.Net中调整(缩小)EMF(元文件)?

我有一个EMF文件。 我想把它缩小一点。

如何在.net(或任何工具)中执行此操作而不会出现模糊图像

生成的已resize的图像将转换为另一种格式(png / jpg /无论如何),我可以处理(我认为)。

我还没有在.Net(或任何语言平台)中找到一个处理emf / metafiles的明确例子。

用GDI +查看了图形编程,但它只引入了Metafiles。

我已经尝试了Image Magick,但你必须转换为另一种格式(我还需要做),结果很模糊(例如缩小并转换为png)。

我已经尝试过Inkscape,但是你只能导入一个EMF文件,并且Inkscape将它倒置并且不成比例地导入到现有的绘图中。

另外,(不要笑)我已经在Window’s Paint中打开了它(少数几个将打开emf的图像编辑软件程序之一)并调整了绘图大小,再次模糊。

更新:这是我用来resize的代码。

这样可行,但生成的图像模糊不清。 代码只是一个通用的图像重新调整例程,不是特定于EMF的

private static Image resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; int sourceHeight = imgToResize.Height; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)size.Width / (float)sourceWidth); nPercentH = ((float)size.Height / (float)sourceHeight); if (nPercentH < nPercentW) nPercent = nPercentH; else nPercent = nPercentW; int destWidth = (int)(sourceWidth * nPercent); int destHeight = (int)(sourceHeight * nPercent); Bitmap b = new Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage((Image)b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); g.Dispose(); return (Image)b; } 

资料来源: http : //www.switchonthecode.com/tutorials/csharp-tutorial-image-editing-saving-cropping-and-resizing

我使用以下代码(类似于编辑后的代码)来重新调整emf图像的大小。 它似乎并不模糊。

 var size = new Size(1000, 1000); using(var source = new Metafile("c:\\temp\\Month_Calendar.emf")) using(var target = new Bitmap(size.Width, size.Height)) using(var g = Graphics.FromImage(target)) { g.DrawImage(source, 0, 0, size.Width, size.Height); target.Save("c:\\temp\\Month_Calendar.png", ImageFormat.Png); } 

.Net可以加载和绘制EMF:

 Metafile myMetafile = new Metafile("SampleMetafile.emf"); graphics.DrawImage(myMetafile, 100, 100); 

如果结果图像模糊,请考虑另存为无损压缩的PNG / GIF,或渲染为较大的图像。

如果结果仍然不够好,那么您需要使用GDI32来加载和渲染。

EMFresize可能非常棘手。 您可以在较小的位图中栅格化图像,但结果并不总是您所期望的。 以下是视图策略的结果:

3种不同的策略

对于我自己的项目,我决定使用最后一个策略:将EMF放在比EMF大4倍的位图中,将其保存到PNG,然后将PNG保存在较小的文件中。

我写了一篇关于这个主题的博客: 用.Net / C#光栅化EMF文件 。 我在GitHub上创建了一个有助于调整EMF大小的类,但这是一种稍微复杂的做事方式(带有边界框)。