压缩图像而不保存

时间:2015-10-28 14:36:40

标签: c# image compression

我使用以下代码来压缩图像并且它做得很好,但我想使用压缩图像而不是保存它。所以现在我必须保存图像,然后再次读取它,这很慢。有没有办法压缩它而不需要保存它。

    private void compress(System.Drawing.Image img, long quality, ImageCodecInfo codec)
    {
        EncoderParameters parameters = new EncoderParameters(1);
        parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);
        img.Save("check1.jpg", codec, parameters);
    }

    private static ImageCodecInfo GetCodecInfo(string mimeType)
    {
        foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders())
            if (encoder.MimeType == mimeType)
                return encoder;
        throw new ArgumentOutOfRangeException(
            string.Format("'{0}' not supported", mimeType));
    }

1 个答案:

答案 0 :(得分:4)

有一个overload that takes a Stream,因此您可以将其直接保存到MemoryStream,而无需保存到磁盘/重新加载。

EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

var ms = new MemoryStream();
img.Save(ms, codec, parameters);

//Do whatever you need to do with the image
//e.g.
img = Image.FromStream(ms);

您在评论中提到“参数无效”异常的原因是因为在您尝试拨打FromStream之前图像未被处理掉,因此您需要将其处理掉。另外,我不知道你是如何调用这个方法的,但你应该更新它以返回MemoryStream

private void compress(System.Drawing.Image img, long quality, ImageCodecInfo codec)
{
    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

    var ms = new MemoryStream();
    img.Save(ms, codec, parameters);
    return ms;
}

public void MyMethod()
{
    MemoryStream ms;
    using(var img = Image.FromFile("myfilepath.img"))
    {
        ms = compress(img, /*quality*/, /*codec*/);
    }

    using(var compressedImage = Image.FromStream(ms))
    {
        //Use compressedImage
    }
}

注意我如何从压缩中返回ms并捕获它。此外,更重要的是,我们如何将img语句包装在一个using语句中,该语句将正确配置文件句柄,而之后将被处理掉,创建第二个compressedImage }这也在using中,所以当你完成时它会被正确处理掉。