今天來分享的是用 C# 實作壓縮圖片的功能。
我們的網站可能要有圖片上傳的功能。如果每個圖片都10MB、10MB的傳上去,我們的伺服器容量很快就要滿了~"~
所以我們要加入圖片壓縮的功能,讓10MB的檔案變小,可能變成5MB、3MB、1MB等等。看你圖片壓縮比是怎麼設定的。
圖片壓縮後,檔案變小後,代表著圖片上的資訊可能被消失或抹平,白話的意思是壓縮後畫質都會變差。
要如何壓縮後,檔案大幅變小,畫質又好(人能接受的程度),就很吃演算法的功力了。
這邊是參考微軟提供的範例程式做講解。
public ActionResult Upload(HttpPostedFileBase file)
{
if (file == null)
{
return Content("沒有圖片");
}
if (file.ContentType != "image/jpeg")
{
return Content("圖片格式錯誤");
}
if (file.ContentLength > 10 * 1024 * 1024)
{
return Content("圖片不能超過10MB");
}
// Get a bitmap. The using statement ensures objects
// are automatically disposed from memory after use.
using (Bitmap bmp1 = new Bitmap(file.InputStream))
{
ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
// Create an Encoder object based on the GUID
// for the Quality parameter category.
System.Drawing.Imaging.Encoder myEncoder =
System.Drawing.Imaging.Encoder.Quality;
// Create an EncoderParameters object.
// An EncoderParameters object has an array of EncoderParameter
// objects. In this case, there is only one
// EncoderParameter object in the array.
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);//品質0到100分的中間值50分
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"D:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters);
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"D:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters);
// Save the bitmap as a JPG file with zero quality level compression.
myEncoderParameter = new EncoderParameter(myEncoder, 0L);
myEncoderParameters.Param[0] = myEncoderParameter;
bmp1.Save(@"D:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);
}
return Content("成功");
}
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}