3

我正在尝试使用 c#.net 将 wmf 图像文件转换为 png 格式。

但是,保存的图像不清楚。

我的代码:

Metafile img = new Metafile(@"test.wmf");
MetafileHeader header = img.GetMetafileHeader();
Bitmap bitmap = new Bitmap((int)(img.Width / header.DpiX * 100), (int)(img.Height / header.DpiY * 100));
using(Graphics g = Graphics.FromImage(bitmap)){
    g.DrawImage(img, 0, 0);
}
bitmap.Save("test.png", ImageFormat.Png);

我怎么能说清楚?

4

3 回答 3

10

.wmf 文件的 DpiX/Y 值非常大。您需要重新缩放图像以使其更适合显示器的分辨率。这段代码生成了一个看起来不错的元文件版本。您可能需要调整缩放以适应您的需要或之后重新缩放位图:

        using (Metafile img = new Metafile(@"c:\temp\test.wmf")) {
            MetafileHeader header = img.GetMetafileHeader();
            float scale = header.DpiX / 96f;
            using (Bitmap bitmap = new Bitmap((int)(scale * img.Width / header.DpiX * 100), (int)(scale * img.Height / header.DpiY * 100))) {
                using (Graphics g = Graphics.FromImage(bitmap)) {
                    g.Clear(Color.White);
                    g.ScaleTransform(scale, scale);
                    g.DrawImage(img, 0, 0);
                }
                bitmap.Save(@"c:\temp\test.png", ImageFormat.Png);
            }
        }
于 2011-10-31T11:16:43.500 回答
0

最后,我有一个想法!

那就是使用Inkspace。
众所周知,Inkscape 是一个矢量图形编辑器。
今天,我发现 INKSCAPE 有命令行选项!!http://goo.gl/Moksf
所以,我应该做的是使用一些选项调用 incape.exe,例如:

Process.Start("inkscape.exe -f {wmf_filename} -e {png_filename_to_be_made}");

这是转换后的 png 文件:http: //yfrog.com/gyu40ap
非常清晰的 png 图像。这就是我想要的!

谢谢!

于 2011-11-01T01:53:25.417 回答
0

转换为 PNG 时,EMF 矢量可能会非常奇怪(尤其是在使用小格式时)。我最终把它炸了 4 倍,然后把它转换成我想要的大小。使用此策略时结果会更好。

GDI 渲染
来源:https ://keestalkstech.com/2016/06/rasterizing-emf-files-with-net-c/

于 2016-06-02T07:30:42.497 回答