Автоматическое добавление водяного знака к изображению
при поиске решения автоматически помещать водяной знак в изображение в Интернете, я нашел лучшее решение в stackoverflow. Ссылка на вопрос С# - добавить водяной знак к фотографии специальным способом. Особая благодарность Алексу Маслакову и по течению.
Я реализовал это решение с некоторыми изменениями, я хочу поместить водяной знак в центр изображения. Я модифицировал решение, предоставляемое 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]()
пожалуйста, поправьте меня...
спасибо
Ответы
Ответ 1
Наконец, я нахожу решение своего вопроса...
Откорректированный ответ на код следующий
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 в С#, также помогла мне решить эту проблему.
и спасибо всем
окончательный результат
![enter image description here]()
Ответ 2
Ваша оригинальная формула в порядке,
Вы уверены, что разрешение двух одинаково? Установите разрешение DPI вашего изображения водяного знака, равное изображению:
watermarkImage.SetResolution(imageGraphics.DpiX, imageGraphics.DpiY);
(из верхней части головы, но я думаю, что имена свойств верны).
UPDATE:
Измените изображение на растровое изображение, чтобы использовать 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");
}
}
Ответ 3
Попробуйте этот код для выравнивания по центру:
int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);