2014-11-06 66 views
0

我正在压缩使用Telerik RadAsyncUpload控件上传的图像。C#图像压缩 - 导致图像产生作用

在后端我得到的上传的文件输入流(流类),并把它传递给该压缩方法:

private byte[] GetCompressedImage(Stream stream, ImageFormat format) 
    { 
     ImageCodecInfo imgCodec = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == format.Guid); 

     EncoderParameters codecParams = new EncoderParameters(1); 
     codecParams.Param[0] = new EncoderParameter(Encoder.Quality, 70L); 

     using (Bitmap bitmap = new Bitmap(stream)) 
     { 
      using (var ms = new MemoryStream()) 
      { 
       bitmap.Save(ms, imgCodec, codecParams); 
       return ms.ToArray(); 
      } 
     } 
    } 

我然后将字节添加到字节的列表表示上传的每个文件(这个控制允许倍数)。然后我们将它传递到FTP文件夹等。

我不能为我的生活弄清楚为什么它裁剪图像而不是压缩。字节较小,宽度和高度相同,只是不显示图像的任何部分。

任何想法?

+0

您能否显示“将字节添加到字节列表的代码?” – 2014-11-06 17:50:37

+0

您是否尝试过做一个bitmap.Save文件到您的web服务器上,或者返回原始图像字节,以排除您的FTP代码是原因。 – WhoIsRich 2014-11-06 18:06:04

回答

0

我终于搞定了。我将该方法移入我们在字节列表(即上传的文件)中传递的位置,并将Image对象传递给方法而不是流。

/// <summary> 
    /// Compress the image 
    /// </summary> 
    /// <param name="stream">Image stream</param> 
    /// <param name="format">Image format</param> 
    /// <returns>Byte array representing the image</returns> 
    public static byte[] GetCompressedImage(Image original, ImageFormat format) 
    { 
     ImageCodecInfo imgCodec = ImageCodecInfo.GetImageEncoders().First(c => c.FormatID == format.Guid); 

     EncoderParameters codecParams = new EncoderParameters(1); 
     codecParams.Param[0] = new EncoderParameter(Encoder.Quality, 70L); 

     using (var bitmap = new Bitmap(original)) 
     { 
      using (var ms = new MemoryStream()) 
      { 
       bitmap.Save(ms, imgCodec, codecParams); 
       return ms.ToArray(); 
      } 
     } 
    } 

感谢您的建议!