簡體   English   中英

圖片上傳不損失質量

[英]Image upload without loss of quality

我在網站上有一個用戶圖庫,訪問者可以上傳一些圖片。 上傳圖像后,應將其大小調整為一些預定義的預設。 此外,原始圖像也應保存。 對於pngbmp圖像格式,一切正常。 但是,如果我上傳以一種顏色為主的gif格式或jpeg ,上傳的原始圖像似乎被壓縮了。

例如:

原來的:
原圖

上傳:
上傳的圖片

我在谷歌中徹底搜索並找到了一些如何正確上傳圖像的示例。 最后我寫了下一個方法:

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類傳遞上傳的圖像 - 這是一個基於傳入流的圖像。

然后使用一些默認參數保存,這將不再反映原始圖像。

您應該簡單地將傳入的流直接保存到磁盤 - 這將導致原始圖像的精確副本。

像這樣(.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);
        }
    }
}

改編自這個答案

我建議使用 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);

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM