[英]Image upload without loss of quality
我在網站上有一個用戶圖庫,訪問者可以上傳一些圖片。 上傳圖像后,應將其大小調整為一些預定義的預設。 此外,原始圖像也應保存。 對於png
和bmp
圖像格式,一切正常。 但是,如果我上傳以一種顏色為主的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.