2012-10-13 22 views
17

podczas wyszukiwania rozwiązania automatycznego umieszczania znaku wodnego na obrazie w Internecie, znalazłem najlepsze rozwiązanie w stackoverflow. Link do tego pytania to C# - Add watermark to the photo by special way. Moje specjalne podziękowania dla Alex Maslakov i dryndula.Automatyczne dodawanie znaku wodnego do obrazu

Zaimplementowałem to rozwiązanie z pewnymi modyfikacjami, chcę umieścić znak wodny w środku obrazu. I zmodyfikowane rozwiązanie dostarczone przez dryfujący następująco

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"); 
     } 

    } 

ale znak wodny nie jest prawidłowo umieszczony w centrum obrazu (patrz poniżej obrazu).

enter image description here

proszę mnie poprawić ...

dzięki

+0

To szczerze wygląda skupione na mnie. Czy możesz zastąpić ten obraz znaku wodnego pudełkiem, aby uzyskać jasność, gdzie jest on wyłączony? –

+0

zobacz edytowane zdjęcie ... – Riskhan

Odpowiedz

12

w końcu znaleźć rozwiązanie na moje pytanie ...

Kod skorygowana odpowiedź jest następująca

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"); 
     } 

    } 

moi dzięki Furqan Safdar i Abdias Software The linku Problem in tiling image starting at different height using TextureBrush in C# pomógł też mi się rozwiązać ten problem

i dzięki wszystkim

ostatecznie doprowadzić

enter image description here

1

Spróbuj tego kodu dla wyrównania centrum:.

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

Zaimplementowałem twoje rozwiązanie, ale bez zmian w wyniku, patrz zdjęcie edytowane – Riskhan

+0

Przy okazji jest ono ustawione centralnie, ale cięcie z krawędzi, co jest głównie spowodowane mniejszym rozmiarem szczotki. Spróbuj zwiększyć rozmiar pędzla do testowania. –

+0

Nie ma różnicy w obliczonym wyniku w porównaniu z oryginałem. – K3N

5

Oryginalna formuła jest w porządku btw,

czy upewniasz się, że rezolucja obu jest to samo? Ustaw rozdzielczość DPI swojego znaku wodnego obrazu równej obrazka:

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

(od szczytu głowy, ale myślę, że nazwy właściwości są poprawne).

UPDATE:

Zmiana od obrazu do bitmapy w celu wykorzystania SetResolution() - Zobacz, czy zmiana ta działa dla Ciebie - Zmieniłem sposób znak wodny jest narysowany na obraz:

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"); 
    } 
} 
+0

rozdzielczość zdjęcia wynosi 72 dpi, a rozdzielczość znaku wodnego to 96 dpi, nie mogę znaleźć funkcji określonej powyżej, więc zmieniono rozdzielczość znaku wodnego na 72dpi ręcznie , ale nie zmieniłem wyniku. – Riskhan

+0

Zmieniłem trochę twoją rutynę w sposobie rysowania znaku wodnego. Sprawdź, czy to działa. – K3N

+0

Wreszcie znalazłem rozwiązanie, aby rozwiązać problem, zobacz moją własną odpowiedź. wiele podziękowań dla ciebie za wsparcie – Riskhan

Powiązane problemy