2010-12-15 65 views
2

我有以下功能,需要從舊數據庫中存儲爲blobtiff並將其轉換爲jpeg,然後將其作爲varbinary(max)存儲在sql server中。TIFF到JPEG轉換產生更大的圖像尺寸

public byte[] ConvertImage(byte[] imageData) 
{ 
    if (imageData == null) return null; 
    using (var image = Image.FromStream(new MemoryStream(imageData))) 
    { 
     using (Bitmap bmp = new Bitmap(image)) 
     { 
      using (MemoryStream outStream = new MemoryStream()) 
       { 
        bmp.Save(outStream, ImageFormat.Jpeg); 
        return outStream.ToArray(); 
       } 
     } 
    } 
} 

由於某些原因,轉換導致圖像的大小增加了10倍或更多。我做錯了什麼嗎?

感謝所有幫助

+0

您是否有示例TIFF? – VVS 2010-12-15 19:36:34

+0

如果您的TIFF圖像使用有損壓縮,那麼除非您想要降低品質因數,否則請勿使用它。 – ruslik 2010-12-15 19:43:53

+0

TIFF ==數千種不兼容的文件格式。我給了它一個鏡頭,祝你好運。 – 2010-12-20 23:51:37

回答

2

你可以嘗試改變JPEG壓縮級別: http://msdn.microsoft.com/en-us/library/bb882583.aspx

JPEG不會總是比TIFF更好,雖然。 TIFF是一種容器格式,可以使用各種圖像壓縮格式,因此您的圖像可以使用其他方法進行壓縮。

+0

+1:指出'TIFF'支持多種壓縮格式。 – RedFilter 2010-12-15 19:50:22

1

您需要爲質量添加EncoderParameter。嘗試類似於:

public byte[] ConvertImage(byte[] imageData) 
{ 
    if (imageData == null) return null; 
    using (var image = Image.FromStream(new MemoryStream(imageData))) 
    { 
     using (Bitmap bmp = new Bitmap(image)) 
     { 
      using (MemoryStream outStream = new MemoryStream()) 
      { 
       var ratio = new EncoderParameter(Encoder.Quality, 50L); //adjust this value for desired compression 
       var codecParams = new EncoderParameters(1); 
       codecParams.Param[0] = ratio; 
       bmp.Save(outStream, GetEncoder(ImageFormat.Jpeg), codecParams); 
       return outStream.ToArray(); 
      } 
     } 
    } 
} 

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