2012-10-13 5 views
17

lors de la recherche d'une solution pour mettre automatiquement un filigrane à une image sur Internet, j'ai trouvé la meilleure solution dans stackoverflow. Le lien pour la question est C# - Add watermark to the photo by special way. Mes remerciements spéciaux à Alex Maslakov et à la dérive.Ajouter automatiquement un filigrane à une image

J'ai implémenté cette solution avec quelques modifications, je veux mettre un filigrane au centre de l'image. J'ai modifié la solution fournie par comme suit la dérive

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

    } 

mais filigrane est pas correctement placé dans le centre de l'image (voir image ci-dessous).

enter image description here

s'il vous plaît me corriger ...

grâce

+0

Il semble honnêtement centrée pour moi. Pouvez-vous remplacer cette image de filigrane avec une boîte pour plus de clarté sur où il est éteint? –

+0

s'il vous plaît voir la photo éditée ... – Riskhan

Répondre

12

Enfin, je trouve la solution à ma question ...

la réponse de code corrigé suit

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

    } 

mes remerciements à Furqan Safdar et Abdias Software Le lien Problem in tiling image starting at different height using TextureBrush in C# m'a aussi aidé à résoudre ce problème

et remercie tous

pour résultat final

enter image description here

1

Essayez ce code pour l'alignement du centre.

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

j'ai mis en application votre solution, mais aucun changement dans le résultat, voir la photo éditée – Riskhan

+0

Par ailleurs il est aligné au centre mais coupant des bords qui est principalement dû à moins de taille de brosse probablement. Essayez d'augmenter la taille du pinceau pour le tester. –

+0

Il n'y a pas de différence dans le résultat calculé par rapport à l'original. – K3N

5

Votre formule originale est très bien BTW,

Assurez-vous que la résolution des deux est le même? Définir la résolution DPI de l'image en filigrane égale à l'image:

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

(à partir du haut de ma tête, mais je pense que les noms de propriété sont corrects).

MISE À JOUR:

Changement d'image en bitmap pour pouvoir utiliser SetResolution() - Voir si ce changement fonctionne pour vous - j'ai changé la façon dont le filigrane est dessiné sur l'image:

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

résolution de l'image est 72dpi et la résolution de watermarkimage est 96dpi, je ne trouve pas la fonction spécifiée ci-dessus, donc la résolution de watermarkimage à 72dpi manuellement , mais pas de changement de résultat – Riskhan

+0

J'ai changé un peu votre routine dans la façon dont elle dessine le waterwark. Voir si cela fonctionne. – K3N

+0

Enfin, j'ai trouvé la solution pour résoudre le problème, s'il vous plaît voir ma propre réponse. merci beaucoup pour votre soutien – Riskhan

Questions connexes