Непонятное преобразованное изображение. WMF в PNG - PullRequest
3 голосов
/ 31 октября 2011

Я пытаюсь преобразовать файл изображения wmf в формат png с помощью c # .net.

Но сохраненное изображение неясно.

мой код:

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);

Как я могу понять это?

Ответы [ 3 ]

8 голосов
/ 31 октября 2011

Файл .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);
            }
        }
0 голосов
/ 02 июня 2016

Векторы ЭДС могут быть очень странными при преобразовании в PNG (особенно, когда используются небольшие форматы).Я закончил тем, что взорвал его в 4 раза, а затем преобразовал в нужный размер.Результаты лучше при использовании этой стратегии.

GDI renderingИсточник: https://keestalkstech.com/2016/06/rasterizing-emf-files-with-net-c/

0 голосов
/ 01 ноября 2011

Наконец-то я получил ИДЕЮ !!

То есть использовать 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. это то, что я хотел!

Спасибо!

...