Image.Save 参数无效

Mat*_*ynn 4 c# asp.net system.io.file

我想用另一个图像为文件夹中的文件添加水印。但是,我收到错误

'参数无效'

调用代码时

img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

我有以下代码;

    public static string WatermarkImagesInFolder(string url)
    {
        if (url == null)
            throw new Exception("URL must be provided");

        string path = HttpContext.Current.Server.MapPath(url);

        if (!Directory.Exists(path))
            throw new DirectoryNotFoundException();

        Directory.CreateDirectory(String.Format(@"{0}\watermarked", path));

        List<string> urls = GetJpgFilesFromFolder(path);

        foreach (string imageUrl in urls)
        {
            Image img = WatermarkImage(imageUrl);

            string filename = Path.GetFileName(imageUrl);
            string filepath = String.Format(@"{0}\watermarked\{1}", path, filename);
            img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

        return "complete";
    }
Run Code Online (Sandbox Code Playgroud)

    public static Image WatermarkImage(string filename)
    {
        using (Image image = Image.FromFile(filename))
        using (Image watermarkImage = Image.FromFile(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["WatermarkImageUrl"])))
        using (Graphics imageGraphics = Graphics.FromImage(image))
        using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage))
        {
            int x = (image.Width / 2 - watermarkImage.Width / 2);
            int y = (image.Height / 2 - watermarkImage.Height / 2);
            watermarkBrush.TranslateTransform(x, y);
            imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width + 1, watermarkImage.Height)));
            return image;
        }
    }
Run Code Online (Sandbox Code Playgroud)

作为 img.save 的输入示例;

img.save("C:\\IMAGES\\wateremarked\\IMAGE (1).jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

关于什么可能导致这里错误的任何想法?

Pau*_*ulF 8

在您的 WatermarkImage 中,您在 using 语句中有图像对象。一旦超出范围,就会在图像上调用 Dispose。您需要返回图像的副本 - 或者不使用 using 语句并确保稍后正确处理。

请参阅:异常:参数无效(将新图像传递给图片框)

public static string WatermarkImagesInFolder(string url)
{
    if (url == null)
        throw new Exception("URL must be provided");

    string path = HttpContext.Current.Server.MapPath(url);

    if (!Directory.Exists(path))
        throw new DirectoryNotFoundException();

    Directory.CreateDirectory(String.Format(@"{0}\watermarked", path));

    List<string> urls = GetJpgFilesFromFolder(path);

    foreach (string imageUrl in urls)
    {
        using(Image img = WatermarkImage(imageUrl))
        {
        string filename = Path.GetFileName(imageUrl);
        string filepath = String.Format(@"{0}\watermarked\{1}", path, filename);
        img.Save(filepath, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }

    return "complete";
}

public static Image WatermarkImage(string filename)
{
    Image image = Image.FromFile(filename);
    using (Image watermarkImage = Image.FromFile(HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["WatermarkImageUrl"])))
    using (Graphics imageGraphics = Graphics.FromImage(image))
    using (TextureBrush watermarkBrush = new TextureBrush(watermarkImage))
    {
        int x = (image.Width / 2 - watermarkImage.Width / 2);
        int y = (image.Height / 2 - watermarkImage.Height / 2);
        watermarkBrush.TranslateTransform(x, y);
        imageGraphics.FillRectangle(watermarkBrush, new Rectangle(new Point(x, y), new Size(watermarkImage.Width + 1, watermarkImage.Height)));
        return image;
    }
}
Run Code Online (Sandbox Code Playgroud)