图像上传不会降低质量

时间:2011-11-17 17:53:11

标签: c# asp.net .net image-processing

我在网站上有一个用户图库,访问者可以上传一些图片。上传后,图像应调整为一些预定义的预设。另外原始图像也应该保存。一切都适用于pngbmp图片格式。但是,如果我上传gif格式或jpeg以一种颜色为主,则上传的原始图片似乎会被压缩。

例如:

原始
Original image

上传
Uploaded image

我在谷歌搜索过,并找到了一些如何正确上传图片的例子。 最后我写了下一个方法:

void UploadImagePreset(Image image, ImageFormat imgFormat, string imgPath)
{
    using (var uploadStream = imageUploader.CreateUploadStream(imagePath))
    {
        var newWidth = image.Width;
        var newHeight = image.Height;
        using (var outBitmap = new Bitmap(newWidth, newHeight))
        {
            using (var outGraph = Graphics.FromImage(outBitmap))
            {
                outGraph.CompositingQuality = CompositingQuality.HighQuality;
                outGraph.SmoothingMode = SmoothingMode.HighQuality;
                outGraph.PixelOffsetMode = PixelOffsetMode.HighQuality;
                outGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;

                var imageRect = new Rectangle(0, 0, newWidth, newHeight);
                outGraph.DrawImage(image, imageRect);

                outBitmap.Save(uploadStream, imgFormat);
            }
        }
    }
}

但它没有帮助。上载的图像与上述相同。 我试图像这样指定结果图像的qaulity:

var encoderParameters = new EncoderParameters();
var encoderParameter = new EncoderParameter(Encoder.Quality, 100);
encoderParameters.Param[0] = encoderParameter;
var encoder = ImageCodecInfo.GetImageEncoders()
    .Where(e => e.FormatID == imgFormat.Guid)
    .FirstOrDefault();
outBitmap.Save(uploadStream, encoder, encoderParameters);

它也不起作用。另外当我上传jpeg图像时发生异常。

是否可以在不压缩或调整大小的情况下上传图片?我花了几个小时试图解决这个问题并坚持下去。

2 个答案:

答案 0 :(得分:7)

您正在通过Image课程传递上传的图片 - 这是一张基于传入流的图片。

然后使用一些默认参数保存它,这些参数将不再反映原始图像。

您只需将传入的流直接保存到磁盘 - 这将生成原始图像的精确副本。

像这样(.NET 4.0):

using (var uploadStream = imageUploader.CreateUploadStream(imagePath))
{
   using(var fileStream = new FileStream(imgPath, FileMode.Create))
   {
       uploadStream.CopyTo(fileStream);
   }
}

或(.NET 4.0之前版):

using (var uploadStream = imageUploader.CreateUploadStream(imagePath))
{
    using(var fileStream = new FileStream(imgPath, FileMode.Create))
    {
        byte[] buffer = new byte[32768];
        int read;
        while ((read = uploadStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fileStream.Write(buffer, 0, read);
        }
    }
}

改编自this answer

答案 1 :(得分:1)

我建议使用Image Codecs(您的第二个示例)进行无损图像压缩。

通过对代码进行少量修改,我建议你试试这个:

Bitmap bm = (Bitmap)Image.FromFile(filePath); 
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo codecInfo = null; 
foreach (ImageCodecInfo codec in codecs)
{ 
    if (codec.MimeType == "image/jpeg") 
        codecInfo = codec; 
}
EncoderParameters ep = new EncoderParameters(); 
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100); 
bm.Save("C:\\quality" + x.ToString() + ".jpg", codecInfo, ep);

希望这会有所帮助。