C # Водяной знак изображения без наложения

2

То, что я пытаюсь сделать, это написать строку для изображения без наложения изображения. Поэтому я хочу, чтобы изображение с водяным значком (водяной знак) было помечено снизу без фактического воздействия на изображение или растяжения изображения. Я уже знаю, как превратить строку в изображение, просто имея проблемы с выполнением водяного знака.

1) Введите строку в изображение справа внизу страницы 2) не растягивайте исходное изображение
3) немного расширить растровое изображение, чтобы включить водяной знак?

Есть ли у кого-нибудь пример или идея, с чего начать? Если я не буду иметь никакого смысла, я постараюсь ответить на любые вопросы.

Пример растрового изображения:

вот код, который я использую для получения растрового изображения, как увеличить размер X на 20?

Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted);
Bitmap newImage = new Bitmap(original);

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

@ROY: Это редактирование, которое я сделал.

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

private static Bitmap WatermarkImage2(Bitmap bmpOriginal, String waterMark2)
    {
        using (Graphics gfxOriginal = Graphics.FromImage(bmpOriginal))
        {
            using (Font fntWatermark = new Font("Arial", 24, FontStyle.Regular))
            {
                SizeF szWatermark = gfxOriginal.MeasureString(waterMark2, fntWatermark, int.MaxValue);
                Bitmap bmpWatermarked2 = new Bitmap(bmpOriginal.Width, bmpOriginal.Height + (int)(szWatermark.Height * 2));
                using (Graphics gfxWatermarked = Graphics.FromImage(bmpWatermarked2))
                {
                    gfxWatermarked.Clear(Color.White);
                    gfxWatermarked.DrawImageUnscaled(bmpOriginal, 0, 0);
                    gfxWatermarked.DrawString(waterMark2, fntWatermark, Brushes.Black, 0, (bmpOriginal.Height + szWatermark.Height) - (szWatermark.Height / 2));
                }
                return bmpWatermarked2;
            }
        }
    }
  • 0
    Не могли бы вы указать, используете ли вы GDI (System.Drawing) или какую-то другую библиотеку?
  • 0
    Можете ли вы уточнить, что вы подразумеваете под «без наложения» и «без фактического воздействия»? Вы хотите напечатать текст в разделе растрового изображения, в котором нет важных визуальных элементов? Как бы вы это определили? Кроме того, в чем разница между «не растягивать» и «немного растянуть»? Вы хотите добавить черную полосу внизу изображения и поместить туда текст? Это не совсем водяные знаки.
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Это может сработать для вас:

    private static Bitmap WatermarkImage(Bitmap bmpOriginal, String waterMarkLeft, String waterMarkRight)
    {
        using (Graphics gfxOriginal = Graphics.FromImage(bmpOriginal))
        {
            using (Font fntWatermark = new Font("Arial", 12, FontStyle.Regular))
            {                    
                SizeF szWatermarkLeft = gfxOriginal.MeasureString(waterMarkLeft, fntWatermark, int.MaxValue);
                SizeF szWatermarkRight = gfxOriginal.MeasureString(waterMarkRight, fntWatermark, int.MaxValue);

                float heightWatermark = szWatermarkLeft.Height > szWatermarkRight.Height ? szWatermarkLeft.Height : szWatermarkRight.Height;

                Bitmap bmpWatermarked = new Bitmap(bmpOriginal.Width, bmpOriginal.Height + (int)(heightWatermark * 2));

                using (Graphics gfxWatermarked = Graphics.FromImage(bmpWatermarked))
                {
                    gfxWatermarked.Clear(Color.White);
                    gfxWatermarked.DrawImageUnscaled(bmpOriginal, 0, 0);
                    gfxWatermarked.DrawString(waterMarkLeft, fntWatermark, Brushes.Black, 0, (bmpOriginal.Height + heightWatermark) - (szWatermarkLeft.Height / 2));
                    gfxWatermarked.DrawString(waterMarkRight, fntWatermark, Brushes.Black, (bmpOriginal.Width - szWatermarkRight.Width), (bmpOriginal.Height + heightWatermark) - (heightWatermark / 2));                        
                }

                return bmpWatermarked;                                        
            }
        }
    }

Тогда вы бы назвали это следующим образом:

using (Bitmap bmpWatermarked = WatermarkImage((Bitmap)Bitmap.FromFile(@"c:\\test.bmp"), @"Copyright (C) A Corp."))
{
    bmpWatermarked.Save(@"c:\watermarked.bmp");
}

В сочетании с вашим кодом выше:

Bitmap original = (Bitmap)System.Drawing.Image.FromFile(coveted); 
Bitmap newImage = new Bitmap(original); 
using (Bitmap bmpWatermarked = WatermarkImage(newImage, @"Copyleft (C) A Corp.", @"Copyright (C) B Corp."))
{
  bmpWatermarked.Save(@"c:\watermarked.bmp");
}
  • 0
    Выглядит неплохо. Несколько замечаний: DrawImageUnscaled () на самом деле не работает. Используйте перегрузку, которая устанавливает размер изображения. И Image.Save () не сохраняет в формате BMP по умолчанию, переименуйте файл в .png
  • 0
    @roy Я не могу заставить эту часть скомпилировать, используя (Bitmap bmpWatermarked = WatermarkImage ((Bitmap) Bitmap.FromFile (newImage, true), @ "Copyright (C) A Corp.")). Это говорит мне об ошибке 1. для 'System.Drawing.Image.FromFile (string, bool)' есть недопустимые аргументы
Показать ещё 20 комментариев
1

Похоже, что вы хотите сделать, просто сделайте изображение больше оригинала и включите "водяной знак" внизу, как нижний колонтитул изображения.

Что вам нужно сделать, так это создать новый объект Bitmap, который больше исходного изображения (по количеству водяного знака). Затем используйте метод Graphics DrawImageUnscaled, чтобы нарисовать исходное изображение на 0,0, а затем нарисуйте изображение водяного знака внизу (или вправо или где угодно).

  • 0
    Это то, что я предполагаю, но как мне определить нижние правые координаты и достаточно места, чтобы включить весь мой водяной знак. Я знаю, как использовать MeasureString, но у меня много времени, чтобы его обдумать
  • 0
    Если у вас есть конкретные проблемы с MeasureString, я бы посоветовал опубликовать ваш код. Также имейте в виду, что MeasureString не совсем ... ну ... точно. Он использует среднюю ширину шрифта для определения определенных показателей.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню