1

jpg 画像に別の jpg 画像で透かしを入れようとしています。結果の画像を新しい画像として保存するとうまくいきます。元の画像ファイルを透かし画像で更新することはできますか? 別のファイルとして保存する必要はありません。

これが私のコードです:

//watermark image 

Bitmap sizedImg = (Bitmap)System.Drawing.Image.FromFile(@"C:\report branding.jpg");

//original file

System.Drawing.Bitmap template=(System.Drawing.Bitmap)System.Drawing.Image.FromFile(@"C:\CentralUtahCombined1.jpg");            


 Graphics g = Graphics.FromImage(template);
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                g.DrawImage(sizedImg, new Point(template.Width - sizedImg.Width,
                             template.Height - sizedImg.Height));


            //watermarking the image but saving it as a different image file - here if I //provide the name as the original file name, it throws an error
            string myFilename = @"C:\CentralUtah.jpg";

            template.Save(myFilename);


            template.Dispose();
            sizedImg.Dispose();
            g.Flush();
4

2 に答える 2

3

Image.FromFileは、元のファイルのロックを保持します。ファイルから直接イメージを作成するのではなく、FileStreamからファイルを開いて、そのストリームからイメージを作成してみてください。このようにして、ファイルのロックが解除されるタイミングを制御できます。

これを試して:

public static Image CreateImage(string filePath)
{
    using(var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        return Image.FromStream(fs);
}

もう少し情報。MSDNは、Image.FromFileは、イメージが破棄されるまでロックを保持すると述べています。http://msdn.microsoft.com/en-us/library/stf701f5.aspx

FromStreamメソッドは、ストリームが開いたままであることを示唆していることに気づきました。それでも問題が解決しない場合は、バイトをメモリストリームに読み込んでみてください。この例では、メモリストリームは破棄されません。これをコードに適合させたら、ストリームを破棄することをお勧めします。:)

public static Image CreateImage(string filePath)
{
        var bytes = File.ReadAllBytes(filePath);
        var ms = new MemoryStream(bytes);
        return Image.FromStream(ms);
}
于 2013-03-19T23:31:56.330 に答える
1

Image.FromFileメソッドがファイルをロックしていることが原因である可能性があります。
ファイルをロックせずにロードする方法については、次の回答を参照してください:https ://stackoverflow.com/a/3389126/214222

于 2013-03-19T23:33:54.083 に答える