在c#中預設可以講bitmap儲存為gif等格式,但是這種儲存方法儲存的gif會嚴重失真
正常情況下的代碼:
1 System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c:\\original_image.gif“);
2 System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
3 thmbnail.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
今天準備開始寫一個批量處理圖片的軟體,包括各種處理方式,處理效果,但是在儲存為gif的時候出現了問題,在網上查了很久
也沒有發現一個可用的改善gif圖片品質的方法,很多人都在問這個問題,但是很少人回答正確,但是功夫不負有心人,今天晚上
我終於找到了一個解決辦法,儲存出來的gif容量大減,但是效果基本符合常規
這中方法就是就是“Octree“ 演算法。“Octree“ 演算法允許我們插入自己的演算法來量子化我們的映像。
一個好的“顏色量子化”演算法應該考慮在兩個像素顆粒之間填充與這兩個像素顏色相近的過渡顏色,提供更多可視色彩空間。
Morgan Skinner提供了很好的“Octree“ 演算法代碼,大家可以下載參考使用。
使用OctreeQuantizer很方便:
1 System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c:\\original_image.gif“);
2 System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
3 OctreeQuantizer quantizer = new OctreeQuantizer ( 255 , 8 ) ;
4 using ( Bitmap quantized = quantizer.Quantize ( thmbnail ) )
5 {
6 quantized.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
7 }
8 OctreeQuantizer grayquantizer = new GrayscaleQuantizer ( ) ;
9 using ( Bitmap quantized = grayquantizer.Quantize ( thmbnail ) )
10 {
11 quantized.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
12 }
你可以點擊這裡下載類的檔案(專案檔),根據我的試用,只需要兩個類檔案(OctreeQuantizer.cs,Quantizer.cs)即可運行,將這兩個類檔案的namespace改成
你項目的名稱就行,還有,需要在不安全編譯的方式下編譯,右擊項目名稱,在產生選項卡裡選擇"允許不安全的程式碼"即可