c# - 图片上传不损失质量

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

我在网站上有一个用户画廊,访问者可以上传一些图片。上传图像后,应将其大小调整为一些预定义的预设。此外,原始图像也应保存。 png 一切正常和 bmp图像格式。但是如果我上传 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);
            }
        }
    }
}

但这并没有帮助。上传的图像与上述相同。
我已经尝试指定结果图像的质量,如下所示:
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 图片时发生异常。

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

最佳答案

您正在通过 Image 传递上传的图像类 - 这是一个新图像,基于传入的流。

然后使用一些默认参数保存,这些参数将不再反射(reflect)原始图像。

您应该简单地将传入的流直接保存到磁盘 - 这将产生原始图像的精确副本。

像这样(.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 .

关于c# - 图片上传不损失质量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8171918/

相关文章:

asp.net - 使用 Identity Server 3,ClaimsPrinciple 即使在不记名 token 身份验证成功后仍为空

c# - 如何从 WebBrowser Control 为任意域设置和删除 cookie

c# - 检索电子邮件的 AlternateView

c# - 如何设置 Unity 注册约定?

c# - 如何通过单击按钮向上或向下移动 ListView 项目

c# - 如何将一长串参数传递给方法或实现此目的的任何其他最佳方法

asp.net - 这些<% ... %>是什么?以及在页面中可以通过哪些方式使用它们

asp.net - 单元测试 Web 服务 - HttpContext

c# - 需要帮助合并两个 LINQ 语句

c# - 如何在不降低 C# 质量的情况下调整 Gif 的大小