简体   繁体   中英

Compress Image size and return image c#

I am making a function where I pass an Image and that will compress the image and return that image object. Following is my code:

public Image CompressImage(Image img)
{
    ImageCodecInfo jpegCodec = null;
    EncoderParameter imageQualitysParameter = new EncoderParameter(
                System.Drawing.Imaging.Encoder.Quality, 50L);
    ImageCodecInfo[] alleCodecs = ImageCodecInfo.GetImageEncoders();

    EncoderParameters codecParameter = new EncoderParameters(1);
    codecParameter.Param[0] = imageQualitysParameter;
    for (int i = 0; i < alleCodecs.Length; i++)
    {
        if (alleCodecs[i].MimeType == "image/jpeg")
        {
            jpegCodec = alleCodecs[i];
            break;
        }
    }
    Image img1;
    using (Stream memory = new MemoryStream())
    {
        img.Save(memory, jpegCodec, codecParameter);
        img1 = Image.FromStream(memory);
        memory.Close();
        memory.Dispose();
    }
    return img1;
}

But When I am saving it in the memory stream, it is showing error

An unhandled exception of type 'System.ArgumentException' occurred in EnexolImageConversionApp.exe

Additional information: Parameter is not valid.

on line

img.Save(memory, jpegCodec, codecParameter);

Try this code - it selects proper ImageCodecInfo by comparing ImageFormat.Guid and ImageCodecInfo.FormatID :

    using System.Drawing.Imaging;
    using System.IO;

    public static byte[] SaveImageToByteArray(Image image, int jpegQuality = 90)
    {
        using (var ms = new MemoryStream())
        {
            var jpegEncoder = GetEncoder(ImageFormat.Jpeg);
            var encoderParameters = new EncoderParameters(1);
            encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, (long)jpegQuality);
            image.Save(ms, jpegEncoder, encoderParameters);
            return ms.ToArray();
        }
    }

    private static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        var codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }

        return null;
    }

Last step will be loading image again from received byte array. For better issue understanding please provide exception details, including stacktrace.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM