Saving image. A common error occurred in GDI +

I get

A common error occurred in GDI +

exception when I call img.Save(path, jpegCodec, encoderParams);
here is the whole code:

    private Image img;

    private void button1_Click(object sender, EventArgs e)
    {
        this.img = Image.FromFile(@"path");

        pictureBox1.Image = img;

        if (img.Height < pictureBox1.Height && img.Width < pictureBox1.Width)
        {
            this.pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
        }

        Graphics g = Graphics.FromImage(img);

        Font font=new Font("Arial",16);

        SolidBrush brush = new SolidBrush(Color.Black);

        brush.Color = Color.FromArgb(255, 0, 0, 255);

        g.DrawString("myName", font, brush, img.Width - 178, img.Height-105);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Bitmap bitmap = new Bitmap(img);

        saveJpeg(@"path", bitmap, 85L);
    }

    private void saveJpeg(string path, Bitmap img, long quality)
    {
        // Encoder parameter for image quality
        EncoderParameter qualityParam =new EncoderParameter(Encoder.Quality, quality);

        // Jpeg image codec
        ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg");

        if (jpegCodec == null)
            return;

        EncoderParameters encoderParams = new EncoderParameters(1);
        encoderParams.Param[0] = qualityParam;

        //img.Save(path, jpegCodec, encoderParams);
        img.Save(path, jpegCodec, encoderParams);
    }
    private ImageCodecInfo getEncoderInfo(string mimeType)
    {
        // Get image codecs for all image formats
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

        // Find the correct image codec
        for (int i = 0; i < codecs.Length; i++)
            if (codecs[i].MimeType == mimeType)
                return codecs[i];
        return null;
    }

Will you help me?

+3
source share
2 answers

As long as the image object exists, created when loading the image from the file, the file is used. You cannot save the image with the same name while using the file.

Instead of using the Image.FromFileimage to download, open the file stream and use Image.FromStreamto create the image, then close the file stream. Thus, the file is no longer used, and you can replace it.

+7
source
public ActionResult CropImage(string hdnx, string hdny, string hdnw, string hdnh)
{
    string fname = "pool.jpg";
    string fpath = Path.Combine(Server.MapPath("~/images"), fname);
    Image oimg = Image.FromFile(fpath);
    Rectangle cropcords = new Rectangle(
    Convert.ToInt32(hdnx),
    Convert.ToInt32(hdny),
    Convert.ToInt32(hdnw),
    Convert.ToInt32(hdnh));
    string cfname, cfpath;
    Bitmap bitMap = new Bitmap(cropcords.Width, cropcords.Height,img.PixelFormat);

    Graphics grph = Graphics.FromImage(bitMap);
    grph.DrawImage(oimg, new Rectangle(0, 0, bitMap.Width, bitMap.Height), cropcords, GraphicsUnit.Pixel);
    cfname = "crop_" + fname;
    cfpath = Path.Combine(Server.MapPath("~/cropimages"), cfname);
    bitMap.Save(cfpath);

    return Json("success",JsonRequestBehavior.AllowGet);
}
0

Source: https://habr.com/ru/post/1723639/


All Articles