2012-08-23 15 views
6

我有一个EMF文件。我想调小它的大小。如何在.Net中调整(缩小)EMF(图元文件)?

我该如何在.net(或任何工具)下做到这一点没有得到模糊的图像

由此产生的调整大小的图像将被转换为另一种格式(PNG/JPG /无论),我可以处理(我认为)。

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

我查看了GDI +图形编程+,但它只引入了图元文件。

我试过Image Magick,但你必须转换为另一种格式(我需要做的是反正),结果是模糊的(当缩小和转换为PNG例如)。

我试过Inkscape,但是你只能导入一个EMF文件,而Inkscape会导入它倒置并且不成比例地进入现有的绘图。另外,(不要笑)我已经在Window's Paint(打开emf的几个图像编辑软件程序之一)中打开它,并调整了绘图的大小,但它又模糊不清。

更新: 这里是我用来调整大小的代码。

这有效,但生成的图像模糊。该代码仅仅是一个普通的图像尺寸调整程序,而不是具体到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

+0

我正要问你在哪里绘制EMF。但是,刚才发布的Magnus应该涵盖你想要做的一切。 –

回答

5

即时通讯使用下面的代码(类似于你有什么编辑之后)重新上浆一个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); 
} 
+0

Magnus,对于增加尺寸,这可以很好地工作。但是,当您缩小尺寸(缩小尺寸)时,您会看到模糊的图像。将其与在Word或Visio中加载EMF进行比较。您可以缩小图像而不会造成巨大的质量损失。当你用你的方法(或我的方法)做同样的事情时,你会失去质量。 –

+0

@ChrisWeber你可能会考虑使用[MFRasterizer库](http://wmf.wholegroup.com/) – Magnus

+1

原来这个质量对我来说已经足够了。在我的问题代码为我工作B/C它保持图像的比例。 –

1

的.Net可以加载和绘制EMF:

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

如果结果图像是模糊的,考虑保存为PNG/GIF具有无损压缩,或者渲染到较大的图像。

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

+0

我可以加载它。问题在于调整大小。 –

+1

模糊性有三个原因:1)图像大小,2)图像压缩,3)渲染。当GDI +呈现EMF时,它会呈现抗混叠渲染,这可能会导致模糊。 –

0

EMF调整大小可能非常棘手。您可以将图像栅格化为较小的位图,但结果并非总是您所期望的。下面是一个视图策略结果:

3 different strategies

对于我自己的项目,我决定利用最后的策略:在一个位图4X电动势的大小炸毁EMF,将其保存为PNG,然后将PNG保存在更小的文件中。

我写过关于这个主题的博客:Rasterizing EMF files with .Net/C#。 我创建了一个帮助调整EMF大小的class on GitHub,但它是一种稍微更复杂的做法(使用边界框)。

相关问题