用C#加水印jpg文件

时间:2013-03-19 23:19:30

标签: c# watermark

我正在尝试用另一个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();

2 个答案:

答案 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