我正在尝试用另一个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();
答案 0 :(得分: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);
}
答案 1 :(得分:1)
可能是因为Image.FromFile
方法锁定了文件
有关如何在不锁定文件的情况下加载文件的方法,请参阅此答案:https://stackoverflow.com/a/3389126/214222