работа с изображениями C#

265
25 января 2018, 16:39

каким наиболее простым способом можно программно наложить текст на изображение? в какую сторону копать, и какими библиотеками это проще всего сделать.

Answer 1

Да запросто. Например, можно воспользоваться WPF-овскими средствами.

Создайте консольное приложение, добавьте ссылки на сборки WindowsBase и PresentationCore.

Пишем!

using System;
using System.Globalization;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace TextOnImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // параметры -->
            var imagePath = @"D:\input.jpg";
            var text = "Это норма!";
            var resultPath = @"D:\output.jpg";
            var background = Brushes.Black;
            var textColor = Brushes.White;
            var gap = 20;
            var fontSize = 70;
            var dpi = 96;
            var font =
                new Typeface(
                    new FontFamily("Segoe UI"), FontStyles.Normal,
                    FontWeights.Bold, FontStretches.SemiExpanded);
            // <--
            var image = BitmapFrame.Create(new Uri("file://" + imagePath));
            var imageWidth = (double)image.PixelWidth;
            var imageHeight = (double)image.PixelHeight;
            var formattedText =
                new FormattedText(
                    text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                    font, fontSize, textColor, dpi)
                {
                    MaxTextWidth = imageWidth,
                    TextAlignment = TextAlignment.Center
                };
            var textWidth = formattedText.Width;
            var textHeight = formattedText.Height;
            var totalWidth = (int)Math.Ceiling(imageWidth + 2 * gap);
            var totalHeight = (int)Math.Ceiling(imageHeight + 3 * gap + textHeight);
            var drawingVisual = new DrawingVisual();
            using (var drawingContext = drawingVisual.RenderOpen())
            {
                drawingContext.DrawRectangle(
                    background, null,
                    new Rect(0, 0, totalWidth, totalHeight));
                drawingContext.DrawImage(
                    image,
                    new Rect(gap, gap, imageWidth, imageHeight));
                drawingContext.DrawText(
                    formattedText,
                    new Point(gap, imageHeight + 2 * gap));
            }
            var bmp =
                new RenderTargetBitmap(
                    totalWidth, totalHeight, dpi, dpi,
                    PixelFormats.Pbgra32);
            bmp.Render(drawingVisual);
            var encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (var stream = File.Create(resultPath))
                encoder.Save(stream);
        }
    }
}

Получаются вот такие картинки:

READ ALSO
Параметры в MySQL запросе не заменяются C#

Параметры в MySQL запросе не заменяются C#

В запрос не подставляются параметры, делаю так:

230
Получить все переменные из класса

Получить все переменные из класса

С помощью определенной функции получаю все ссылки на классы в нужном Gameobject

241
Что такое WinRT и с чем его едят?

Что такое WinRT и с чем его едят?

Рихтер в своей книге целую главу посвятил данному механизму, но я так и не понял в каких сценариях его имеет смысл применять

264
Помогите написать программу в C# [требует правки]

Помогите написать программу в C# [требует правки]

ПриветПомогите написать программу в C#

353