Манипулирование изображениями - PullRequest
1 голос
/ 07 октября 2010

Мне нужен простой в освоении и быстрый способ создания изображений из фонового изображения, текстов и после этого сохранения в формате JPEG.

Что вы можете предложить? Любая библиотека или учебник по этому вопросу? Важным критерием является простота.

Ответы [ 4 ]

6 голосов
/ 07 октября 2010

в .Net 3.5 / 4 вы также можете использовать WPF / Media.Imaging в качестве альтернативы GDI +

Сначала создайте DrawingVisual и DrawingContext :

DrawingVisual visual = new DrawingVisual();
DrawingContext dc = visual.RenderOpen();

Затем нарисуйте на нем вещи:

dc.DrawRectangle(...);
dc.DrawText(...);
etc...

Убедитесь, что вы закрыли его:

 dc.Close();

Самое замечательное в WPF - это то, что все в графическом интерфейсе на самом деле тоже визуал, поэтому, если вы предпочитаете, чтобы вам не приходилось использовать приведенный выше код для программной прорисовки, вы можете создать свой визуал в xaml на окне и затем просто визуализируем это прямо в RenderTargetBitmap .

После того, как вы построили свой визуал, вы можете отобразить его в файл, используя кодировщик (.Net имеет кодировщики для JPEG , Png , Bmp , Gif , Tiff и Wmp ).

// Create a render target to render your visual onto. The '96' values are the dpi's, you can set this as required.
RenderTargetBitmap frame = new RenderTargetBitmap((int)visual.ContentBounds.Width, (int)visual.ContentBounds.Height, 96, 96, PixelFormats.Pbgra32);
frame.Render(visual);

// Now encode the rendered target into Jpeg and output to a file.
JpegBitmapEncoder jpeg = new JpegBitmapEncoder();
jpeg.Frames.Add(BitmapFrame.Create(frame));
using (Stream fs = File.Create(@"c:\filename.jpg"))
{
    jpeg.Save(fs);
}

Есть несколько хороших учебников по MS Рисование объектов и Визуализация графики WPF .

4 голосов
/ 07 октября 2010

Я обычно делаю это, используя GDI+.В сети есть множество обучающих программ по этому вопросу, но в основном вам нужно сделать что-то вроде этого:

using(Image image = new Bitmap(Width, Height))
using (Graphics g = Graphics.FromImage(image)) {
  g.Draw....
  g.Draw....
  image.Save(filename, ImageFormat.Jpeg);
}

При вызовах Draw.... вы можете рисовать примитивы, изображения, текст и так далее.

Также помните, что текст выглядит неровным, у вас есть методы для объекта Graphics, чтобы сгладить это.В этом случае g.TextRenderingHint = TextRenderingHint.AntiAlias;

Есть и другие варианты, чтобы он выглядел лучше, если вы чувствуете, что он неровный.Настройки по умолчанию ориентированы больше на производительность, чем на качество, поэтому, если вы хотите высокое качество, вам нужно установить это самостоятельно.g.SmoothingMode Например, HighQuality сделает ваши круглые примитивы намного более гладкими, чем конфигурация по умолчанию.

Это действительно просто в использовании, и финальное изображение выглядит так, как вы хотите, поэтому дайтеэто попытка!

0 голосов
/ 07 октября 2010

Вместо старого доброго GDI + вы можете использовать более современные (и часто более быстрые) System.Windows.Media.Imaging API.

0 голосов
/ 07 октября 2010

GDI + и пространство имен System.Drawing - это то, что требуется, чтобы делать то, что вы хотите.Ниже приведен базовый пример, но в сети есть много ресурсов, детализирующих более продвинутые функции:

using(Bitmap myBitmap = new Bitmap("C:\\backgroundImage.jpg"))
using(Graphics g = Graphics.FromImage(myBitmap))
{
   g.DrawString("Text", new Font("Arial", 10), Brushes.White, new PointF(0, 0));
   myBitmap.Save("C:\\newImage.jpg");
}
...