//บทความนี้แปลโดย www.blue1000.com ที่อยู่เดิมคือ http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx
//เคารพผลงานของผู้อื่น โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำ
GDI+ มักใช้ในการเขียนโปรแกรม สามารถบันทึกรูปภาพขนาด 32 bpp ที่มืดเป็นไฟล์ GIF ได้ และกระบวนการนี้ค่อนข้างง่าย และก่อนที่จะบันทึกภาพ GIF นี้โดยใช้วิธี CreateThumnailImage คุณยังสามารถปรับขนาดภาพได้อีกด้วย
รหัสที่ใช้กันทั่วไป:
โค้ดด้านบนสามารถทำให้การวาดและบันทึกไฟล์ gif เสร็จสมบูรณ์ได้ แต่คุณจะพบปัญหาในไม่ช้า: ภาพขนาดย่อที่สร้างขึ้น คุณภาพของรูปภาพของไฟล์ .gif นั้นต่ำกว่าที่เราคาดไว้มาก
ภาพผล:
รูปภาพคุณภาพต่ำและมีเม็ดหยาบที่แสดงด้านบนยังต้องอาศัยการประมวลผล "การวัดปริมาณสี" (การจัดวางจานสี) สิ่งนี้เกิดขึ้นเนื่องจาก GDI+ ใช้ 256 สีเป็นค่าเริ่มต้น โดยไม่คำนึงถึงสีที่แท้จริงของภาพ
หลังจากนั้นเราพยายามสร้าง "จานสี" ของเราเอง แต่ผลลัพธ์กลับแย่ลงไปอีก :) อัลกอริธึม "การวัดปริมาณสี" ที่ดีควรพิจารณาเติมช่องว่างระหว่างอนุภาคพิกเซล 2 อนุภาคด้วยการเปลี่ยนสีที่คล้ายกับสีของพิกเซล 2 พิกเซล ซึ่งจะทำให้พื้นที่สีมองเห็นได้ชัดเจนยิ่งขึ้น
นี่คืออัลกอริทึม "Octree" อัลกอริธึม “Octree” ช่วยให้เราสามารถเสียบอัลกอริธึมของเราเองเพื่อวัดปริมาณภาพของเรา
ต่อไปนี้เป็นบทความสองบทความจาก Microsoft ที่อาจเป็นประโยชน์สำหรับเรา: KB 319061 และ Optimizing Color Quantization for ASP.NET Images (โดย Morgan Skinner, Microsoft) Morgan Skinner มีโค้ดอัลกอริธึม "Octree" ที่ดี ซึ่งคุณสามารถดาวน์โหลดเพื่อใช้อ้างอิงได้
การใช้ OctreeQuantizer เป็นเรื่องง่าย:
System. Drawing.Bitmap b = System. Drawing.Bitmap ใหม่ (“c:\Original_image.gif“);
System. Drawing.Image thmbnail = b.GetThumbnailImage (100,75, null, IntPtr ใหม่ ());
OctreeQuantizer ควอนไทเซอร์ = OctreeQuantizer ใหม่ ( 255 , 8 ) ;
การใช้ (Bitmap quantized = quantizer.Quantize (thmbnail) )
-
quantized.Save(“c:\thumnail.gif“, System. Drawing.Imaging.ImageFormat.Gif);
}
OctreeQuantizer greyquantizer = GrayscaleQuantizer ใหม่ ( );
การใช้ ( Bitmap quantized = greyquantizer.Quantize ( thmbnail ) )
-
quantized.Save(“c:\thumnail.gif“, System. Drawing.Imaging.ImageFormat.Gif);
}
ภาพเอฟเฟกต์เป็นดังนี้ (สวยกว่ามากไหม):