2015-02-09 455 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