2015-02-09 217 views
1

我把这个函数形式上网。这将图像的大小减小到50%。 现在我无法返回下面的位图图像窗体函数。返回从功能降低质量后的位图图像

我无法找到任何当前位图图像到50%并返回它的方法。

我是否需要创建一个内存流然后将其保存在那里?

//reduce Image size 
public void ReduceImageSize(Bitmap bmp1) 
{ 
    var jgpEncoder = GetEncoder(ImageFormat.Jpeg); 
    // Create an Encoder object based on the GUID 
    // for the Quality parameter category. 
    var myEncoder = Encoder.Quality; 
    // Create an EncoderParameters object. 
    // An EncoderParameters object has an array of EncoderParameter 
    // objects. In this case, there is only one 
    // EncoderParameter object in the array. 
    var myEncoderParameters = new EncoderParameters(1); 

    var myEncoderParameter = new EncoderParameter(myEncoder, 50L); 
    myEncoderParameters.Param[0] = myEncoderParameter; 
    //rather than saving it should set to the current bitmap image. 
    //bmp1.Save(@"c:\TestPhoto\TestPhotoQualityFifty.jpg", jgpEncoder, myEncoderParameters); 


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

回答

2

您应该只将文件保存到内存中,然后从内存构建一个新的形象:

using(var ram = new MemoryStream()) 
{ 
    bmp1.Save(ram, jgpEncoder, myEncoderParameters); 
    ram.Seek(0, SeekOrigin.Begin); // reset stream to start so it can be read again 
    return new Bitmap(ram); 
} 
+0

有什么样的内存问题的可以来,如果我们使用这个功能,如果你把这个功能非常频繁。手段可能是每秒平均大小为20 t 25 kb的图像? – 2015-02-09 06:52:37

+0

由于每次调用后内存流都是'Dispose'd,所以我没有看到任何问题。尽管如此,你仍然需要摆脱旧的形象,现在你可以从一个源中取得两个并保持两个。 – nvoigt 2015-02-09 06:54:06

+0

非常感谢您的解释。 – 2015-02-09 06:59:14