Как изменить размер (сжать) EMF (Метафайл) in.Net?

У меня есть файл EMF. Я хочу изменить его размер.

Как это сделать в .net (или с любым инструментом) без получения размытого изображения?

результирующее измененное изображение будет преобразовано в другой формат (png/jpg/whatever), я могу справиться с этим (я думаю).

Я не нашел четкого примера в .Net (или любой языковой платформе), которая имеет дело с emf/metafiles.

Я посмотрел в Программирование Графики с GDI+ но это только вводит Метафайлы.

Я пробовал Image Magick, но вам нужно преобразовать в другой формат (что мне все равно нужно сделать), и результат размыт (например, при сжатии и преобразовании в png).

Я пробовал Inkscape, но вы можете импортировать только файл EMF, а Inkscape импортирует его вниз и непропорционально в существующий рисунок.

кроме того, (не смейтесь) я открыл его в краске окна (один из несколько программ для редактирования изображений, которые откроют 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

3 ответов


Im, используя следующий код (аналогичный тому, что у вас есть после редактирования) для изменения размера изображения 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 для загрузки и рендеринга.


изменение размера EMF может быть довольно сложным. Вы можете растрировать изображение в меньшем растровом изображении, но результаты не всегда то, что вы ожидаете. Вот результаты стратегии просмотра:

3 different strategies

для моего собственного проекта я решил использовать последнюю стратегию: взорвать EMF в растровом изображении 4X размер EMF, сохранить его в PNG, а затем сохранить PNG в меньшем файле.

Я написал блог на эту тему: растеризация файлов EMF с .Нетто / В C#. И я создал класс на GitHub это помогает изменять размер EMF, но это немного более сложный способ делать вещи (с ограничительной рамкой).