2015-10-28 59 views
1

我正在使用以下代码来压缩图像,并且它做的不错,但我想使用压缩的图像而不保存它。所以现在我必须保存图像,然后再次读取,这很慢。有没有一种方法来压缩它,而不是保存它。在不保存的情况下压缩图像

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)); 
    } 

回答

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 
    } 
} 

请注意,我如何从compress压缩ms并将其捕获。此外,更重要的是,我们如何包装在using声明初始img这将配置文件正确处理,并后得到处理创建第二个compressedImage这也是一个using所以它会得到妥善处理当你完成。

+0

当它执行保存时,我现在得到:在System.Drawing.dll中发生未处理的类型为“System.ArgumentException”的异常 附加信息:参数无效。 – kgsw

+0

如果你看看我提供的链接,这个重载不会抛出'ArgumentException',只抛出'ArgumentNullException'和'ExternalException'。你确定你收到一个'ArgumentException'吗?你确定它在'img.Save'行吗? –

+0

这是肯定的保存行,这是从屏幕上复制\ System.Drawing.dll 发生类型'System.ArgumentException'的未处理的异常其他信息:参数无效。 – kgsw

相关问题