0

私は自分自身と職場の他の人のためにバッチ透かしツールを作成しています。次のコードを使用すると、画像の右下にテキストに注釈を付けることができますが、手動で調整しないと左下に注釈を付けることができません与えられた画像ごとに異なる座標。また、 StringAlignment.Far を StringAlignment.Near などに変更しても何も起こりませんが、表示されない画像の外側のテキストに注釈を付ける可能性があります。

MSDN には説明がありますが、役に立ちません。私はしばらくの間これと戦ってきました。

private void button1_Click(object sender, EventArgs e)
{
    foreach (string images in Directory.GetFiles(textBox1.Text))
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(images);

        Graphics gr = Graphics.FromImage(img);

        Font font = new Font("Times New Roman", (float)25, 
            System.Drawing.FontStyle.Regular);
        System.Drawing.Color color = System.Drawing.Color.Red;

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Far;
        stringFormat.LineAlignment = StringAlignment.Far;

        gr.SmoothingMode = SmoothingMode.AntiAlias;

        gr.DrawString("WATERMARK GOES HERE"+ images, font, 
            new System.Drawing.SolidBrush(color), 
            new System.Drawing.Point(img.Width - 0, img.Height - 0), 
            stringFormat);

        MemoryStream outputStream = new MemoryStream();
        img.Save(images+"Stamped.jpg");
    }

    MessageBox.Show("done");
}
4

1 に答える 1

4
  • コントロールに名前を付けます。「button1」、「textbox1」などは使用しないでください。
  • 「using」ステートメントを使用します。「System.Drawing.Point」などの完全修飾名を記述すると、コードのサイズが大きくなり、読みにくくなります。
  • 透かしを入れる画像ごとに、SolidBrush クラスの新しいインスタンスを作成しています。ループの前にブラシを作成し、それをループで使用してから、後で破棄する必要があります。
  • MemoryStream の宣言は何もせず、どこにも使用されません。

透かし自体については、画像サイズに合わせてスケーリングするか、一貫したサイズにするかを決定する必要があります。または、最大/最小サイズを持つことができます。それはあなたの好みです。

private void watermark_btn_Click(object sender, EventArgs e)
{
    string watermarkText = "ShowThisWatermark";

    using (Font font = new Font("Times New Roman", (float)25, FontStyle.Regular))
    using (SolidBrush brush = new SolidBrush(Color.Red))
    foreach (string file in Directory.GetFiles(directory_txt.Text))
    {
        try
        {
            Bitmap b = new Bitmap(file);

            using (Graphics g = Graphics.FromImage(b))
            {
                g.SmoothingMode = SmoothingMode.AntiAlias;

                SizeF measuredSize = g.MeasureString(watermarkText, font);

                // Use this to watermark the bottom-left corner
                g.DrawString(watermarkText, font, brush, 0, b.Height - measuredSize.Height);

                // Use this to watermark the bottom-right corner
                g.DrawString(watermarkText, font, brush, b.Width - measuredSize.Width, b.Height - measuredSize.Height);
            }

            b.Save(Path.GetFileNameWithoutExtension(file) + "_stamped" + Path.GetExtension(file));
        }
        catch
        {
            continue;
        }
    }
}

try/catch は、画像ではないファイルをスキップする怠惰な方法です。Directory.GetFiles はディレクトリ内のすべてのファイルを返すため、画像以外のファイルは例外を引き起こします。これはもっときちんとした方法で行うことができますが、それはあなたの質問の性質ではないので、単純にしました.

于 2011-12-29T06:15:51.143 に答える