我正在尝试用另一张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();发布于 2013-03-20 07:31:56
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-20 07:33:54
这可能是因为Image.FromFile方法锁定了文件。
有关如何在不锁定文件的情况下加载文件的方法,请参阅此答案:https://stackoverflow.com/a/3389126/214222
https://stackoverflow.com/questions/15512364
复制相似问题