Как изменить размер (сжать) 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 может быть довольно сложным. Вы можете растрировать изображение в меньшем растровом изображении, но результаты не всегда то, что вы ожидаете. Вот результаты стратегии просмотра:
для моего собственного проекта я решил использовать последнюю стратегию: взорвать EMF в растровом изображении 4X размер EMF, сохранить его в PNG, а затем сохранить PNG в меньшем файле.
Я написал блог на эту тему: растеризация файлов EMF с .Нетто / В C#. И я создал класс на GitHub это помогает изменять размер EMF, но это немного более сложный способ делать вещи (с ограничительной рамкой).