インターネットで画像に透かしを自動的に付けるソリューションを探しているときに、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");
}
}
透かしが画像の中央に正しく配置されていません(下の画像を参照)。
修正してください...
ありがとう
最後に私は私の質問の解決策を見つけます...
正しいコードの答えは次のとおりです
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ソフトウェアへの感謝 C#でTextureBrushを使用して異なる高さで画像をタイリングする際の問題 もこの問題の解決に役立ちました
そして、すべてに感謝
最終的に結果
元の式は結構です。
2つの解像度が同じであることを確認していますか?透かし画像のDPI解像度を画像と同じに設定します。
_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");
}
}
_
中央揃えのためにこのコードを試してください:
int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);
作業サンプル:
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");