因為某些因素還是得回來使用ImageMagick,並通過Google PageSpeed Insights(GPI)對於圖片品質獨到的見解,就開始把Magick.NET的知識拿出來再翻一次並記錄在此。
Google對於最佳化影像的網址在這裡:Optimize Images,要特別聲明的是這種「標準」隨時會改要有心理準備。所提的「意見標準」如下:
關於Magick.NET的背景知識
其實沒有偏方,因為標準是Google制定的,既然他認為它就是標準我們也只能遵守,因此把建議的指令列出來,跟著建議的參數實作就對了:
convert INPUT.jpg -sampling-factor 4:2:0 -strip [-resize WxH] [-quality N] [-interlace JPEG] [-colorspace Gray/sRGB] OUTPUT.jpg convert puzzle.jpg -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace sRGB puzzle_converted.jpg
程式碼如下(壓出來的圖片可過GPI):
using (var oImage = new ImageMagick.MagickImage("OriginalImagePath.jpg")) { oImage.Settings.SetDefine(ImageMagick.MagickFormat.Jpeg, "sampling-factor", "4:2:0"); oImage.ColorSpace = ImageMagick.ColorSpace.sRGB; oImage.Interlace = ImageMagick.Interlace.Jpeg; oImage.Format = ImageMagick.MagickFormat.Jpeg; oImage.Quality = 85; oImage.Strip(); oImage.Write("DestinationImagePath.jpg"); }
由於網路範例不多,在這邊特別順帶提一下串流型態的無損壓縮(Stream LosslessCompress)與存檔的寫法,給大家參考一下。
var oStream = XXX; //maybe HttpPostedFile.InputStream ... using (System.IO.MemoryStream oMS = new System.IO.MemoryStream()) using (System.IO.FileStream oFS = System.IO.File.Create("DestinationImagePath.jpg")) { //從網路過來的串流幾乎都是唯獨(readonly),但這個ImageOptimizer類別中的方法會採用WriteBack的方式把串流內容覆寫(Overwrite),因此需要複製一份新的串流物件使其可運作 oStream.CopyTo(oMS); //把指標指向位置0 oMS.Seek(0, System.IO.SeekOrigin.Begin); //呼叫無損壓縮方法 var oImage = new ImageMagick.ImageOptimizer(); oImage.LosslessCompress(oMS); //串流回寫檔案 oMS.CopyTo(oFS); }