日期:2014-05-18  浏览次数:20892 次

c#中图片色彩问题
代码如下
C# code

 Bitmap bm = new Bitmap(strPngname);
//strPngname是图片路径
 strTempName = strPngname.Substring(0, strPngname.LastIndexOf("."));//图片所在的文件夹的路径
 string strGifName = strTempName + ".gif";
 bm.Save(strGifName,System.Drawing.Imaging.ImageFormat.Gif);
 bm.Dispose();


生成了张一样名字的GIF图片。可是为什么图片的色彩变了。感觉图片特别粗糙。
怎么才能让转换后的GIF图片色彩不改变。像strPngname图片一样色彩!

------解决方案--------------------
文章页数:[1]
//本文章有www.blue1000.com翻译,原文地址http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx 
//尊重他人劳动成果,转载请注明出处。 

写程序的时候经常用到GDI+,他可以将一幅深色32 bpp图像保存为一个gif文件,过程也比较简单。并且在使用CreateThumnailImage方法保存这个gif图片之前,你还可以调整它的尺寸。
常用的代码:


System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c:\\original_image.gif“); 
System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
thmbnail.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
以上代码可以完成gif文件的绘制和保存工作,但是很快你就会发现问题了:生成的thumnail.gif文件的画质远远低于我们的期望值。
效果图片:



如上图所示的低画质粒状图象还需要进行“颜色量子化”处理(palettization)。之所以会出现这种情况,是因为GDI+默认使用256色,而没有考虑图像自身实际的颜色。

之后,我们尝试着建立自己的“调色板”,可是结果更糟糕:)。一个好的“颜色量子化”算法应该考虑在两个像素颗粒之间填充与这两个像素颜色相近的过渡颜色,提供更多可视颜色空间。
这就是“Octree“ 算法。“Octree“ 算法允许我们插入自己的算法来量子化我们的图像。

这里有微软的两片文章,或许对我们有帮助:KB 319061 和 Optimizing Color Quantization for ASP.NET Images (微软Morgan Skinner著)。Morgan Skinner提供了很好的“Octree“ 算法代码,大家可以下载参考使用。

使用OctreeQuantizer很方便:



System.Drawing.Bitmap b = new System.Drawing.Bitmap(“c:\\original_image.gif“); 
System.Drawing.Image thmbnail = b.GetThumbnailImage(100,75,null,new IntPtr());
OctreeQuantizer quantizer = new OctreeQuantizer ( 255 , 8 ) ;
using ( Bitmap quantized = quantizer.Quantize ( thmbnail ) )
{
quantized.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
}

OctreeQuantizer grayquantizer = new GrayscaleQuantizer ( ) ;
using ( Bitmap quantized = grayquantizer.Quantize ( thmbnail ) )
{
quantized.Save(“c:\\thumnail.gif“, System.Drawing.Imaging.ImageFormat.Gif);
}

效果图片如下(是不是漂亮多了?):