我使用以下代码来压缩图像并且它做得很好,但我想使用压缩图像而不是保存它。所以现在我必须保存图像,然后再次读取它,这很慢。有没有办法压缩它而不需要保存它。
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));
}
答案 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
中,所以当你完成时它也会被正确处理掉。