it-swarm.com.ru

Автоматически добавлять водяной знак на изображение

в процессе поиска решения для автоматического нанесения водяного знака на изображение в Интернете я нашел лучшее решение в stackoverflow. Ссылка на вопрос: C # - Добавить водяной знак к фотографии особым образом . Моя особая благодарность Alex Maslakov и adrift.

Я реализовал это решение с некоторыми изменениями, я хочу поместить водяной знак в центр изображения. Я изменил решение, предоставленное adrift, следующим образом 

   private void button1_Click(object sender, EventArgs e)
    {
        using (Image image = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
        using (Image watermarkImage = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
        using (Graphics imageGraphics = Graphics.FromImage(image))
        using (Brush watermarkBrush = new TextureBrush(watermarkImage))
        {
            int x = (image.Width - watermarkImage.Width)/2;
            int y = (image.Height - watermarkImage.Height)/2;
            imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), watermarkImage.Size));
            image.Save(@"C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
        }

    }

но водяной знак неправильно размещен в центре изображения (см. изображение ниже).

enter image description here

пожалуйста поправьте меня ...

спасибо

23
Riskhan

Наконец я нахожу решение моего вопроса ...

Исправленный код ответа следующий

    private void button1_Click(object sender, EventArgs e)
    {
        using (Image image = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
        using (Image watermarkImage = Image.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
        using (Graphics imageGraphics = Graphics.FromImage(image))
        using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage))
        {
            int x = (image.Width / 2 - watermarkImage.Width / 2);
            int y = (image.Height / 2 - watermarkImage.Height / 2);
            watermarkBrush.TranslateTransform(x, y);
            imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width+1, watermarkImage.Height)));
            image.Save(@"C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
        }

    }

спасибо Furqan Safdar и Abdias Software Ссылка Проблема с мозаичным изображением, начинающимся на разной высоте с использованием TextureBrush в C # также помогла мне решить эту проблему

и спасибо всем

наконец результат

enter image description here

18
Riskhan

Ваша оригинальная формула хорошо между прочим,

вы уверены, что разрешение двух одинаково? Установите разрешение DPI вашего водяного знака равным image:

watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

(от макушки головы, но я думаю, что имена свойств верны).

Обновление:

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

private void button1_Click(object sender, EventArgs e) {

    using (Bitmap image = Bitmap.FromFile("C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"))
    using (Bitmap watermarkImage = Bitmap.FromFile("C:\Users\Public\Pictures\Sample Pictures\watermark.png"))
    using (Graphics imageGraphics = Graphics.FromImage(image))
    {
        watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

        int x = ((image.Width - watermarkImage.Width) / 2);
        int y = ((image.Height - watermarkImage.Height) / 2);

        imageGraphics.DrawImage(watermarkImage, x, y, watermarkImage.Width, watermarkImage.Height);

        image.Save("C:\Users\Public\Pictures\Sample Pictures\Desert_watermark.jpg");
    }
}
7
user1693593

Попробуйте этот код для выравнивания по центру:

int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);
2
Furqan Safdar

Рабочий образец:

public static Bitmap WatermarkImage(Bitmap image, Bitmap watermark)
{
    using (Graphics imageGraphics = Graphics.FromImage(image))
    {
        watermark.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);

        int x = (image.Width - watermark.Width) / 2;
        int y = (image.Height - watermark.Height) / 2;

        imageGraphics.DrawImage(watermark, x, y, watermark.Width, watermark.Height);
    }

    return image;
}

Использование:

Bitmap watermark = new Bitmap(@"c:/watermark.png");
Bitmap bitmap = new Bitmap(@"c:/image.png");
bitmap = WatermarkImage(bitmap, watermark);
bitmap.Save(@"C:/watermarkedImage.png");
0
Erçin Dedeoğlu