26

インターネットで画像に透かしを自動的に挿入するソリューションを探しているときに、stackoverflow で最適なソリューションを見つけました。質問へのリンクはC# - Add watermark to the photo by special wayです。Alex Maslakovadriftに特に感謝 します。

いくつかの変更を加えてそのソリューションを実装しました。画像の中央に透かしを入れたいです。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");
        }

    }

ただし、透かしが画像の中央に正しく配置されていません (下の画像を参照)。

ここに画像の説明を入力

私を修正してください...

ありがとう

4

4 に答える 4

24

最後に、私は私の質問に対する解決策を見つけます...

修正されたコードの回答は次のとおりです

    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 に感謝しますC# で TextureBrush を使用して異なる高さで画像をタイル化する際のリンクの問題も、この問題の解決に役立ちました

そしてみんなありがとう

最終的に結果

ここに画像の説明を入力

于 2012-10-13T07:06:12.293 に答える
8

あなたの元の式は素晴らしいです。、

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");
    }
}
于 2012-10-13T05:58:42.160 に答える
2

中央揃えには、次のコードを試してください。

int x = (image.Width / 2 - watermarkImage.Width / 2);
int y = (image.Height / 2 - watermarkImage.Height / 2);
于 2012-10-13T05:40:42.840 に答える