//本文章有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);
}

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

在.net中使用GDI+来提高gif图片的保存画质相关推荐

  1. 视频剪辑工具,从指定秒数中随机抽帧,以图片格式保存

    视频太多,如何剪辑,比如说按指定的秒数从中随机抽帧,并将帧以图片格式保存到电脑上呢?下面随小编一起来试试. 需要哪些工具? 视频素材若干 怎么快速添加? 打开[媒体梦工厂],在"视频封面&q ...

  2. MFC中的GDI绘图

    MFC中的GDI绘图 目录(?)[+] 什么是GDI 什么是DC MFC中与GDI有关的类 获取设备环境 设置坐标映射 创建绘图工具并选入DC 调用DC绘图函数绘图 三坐标映射实例 一.关于GDI的基 ...

  3. 键盘流的逆袭- Idea 中使用 VIM mode 提高生成效率

    Idea 中使用 VIM mode 提高生成效率 安装配置 Idea 的 vim 插件 先挖坑,后续再填.这个毫无技术含量,不写了,自己去搜吧. 快捷键代替鼠标 打开文件 按两下 shift 键 =& ...

  4. 了解JavaScript中的Memoization以提高性能,再看React的应用

    英文: Understanding Memoization in JavaScript to Improve Performance 中文: 了解JavaScript中的Memoization以提高性 ...

  5. 【Elasticsearch】使用Elasticsearch中的copy_to来提高搜索效率

    1.概述 转载:使用Elasticsearch中的copy_to来提高搜索效率 在今天的这个教程中,我们来着重讲解一下如何使用Elasticsearch中的copy来提高搜索的效率.比如在我们的搜索中 ...

  6. VC++6.0中使用GDI+绘图(转载)

    VC++6.0中使用GDI+绘图 1.在VC++6.0中配置GDI+环境 1.1 下载GDI+库 VC++6.0中没有GDI+库.可以从http://www.crazy-bit.com/downloa ...

  7. GDI+入门(5、在GDI+中绘制带动画效果的图片)

    五.在GDI+中绘制带动画效果的图片 private void Form2_Load(object sender, EventArgs e) { SetStyle(ControlStyles.Doub ...

  8. VC2008中使用GDI+(转)

    转自http://blog.csdn.net/HeLiang7/archive/2008/05/18/2456453.aspx 研究了两天的GDI,发现太麻烦了.想到C#中的方便GDI+操作,于是查了 ...

  9. vs2008中使用gdi+的设置

    vs2008中使用gdi+ 1.新建一个mfc工程 2.在stdafx.h文件中加入以下几行语句: #include <gdiplus.h>                // #prag ...

最新文章

  1. 宇宙是一个图网络?「全球最聪明的人」刚刚为物理基础理论指出了全新道路...
  2. Activity销毁重建导致LiveData数据倒灌
  3. 让Linux系统崩溃最快速的方法
  4. 三层开发中容易犯的错误
  5. 数据库性能优化—SQL优化十大原则
  6. SUSE团队已将重心偏向GCC 7
  7. java 解析http返回的xml_Java解析调用webservice服务的返回XML串详解
  8. 自定义分页 html,MVC 自定义HtmlHelper帮助类型之分页
  9. mysql建立索引的优缺点|创建索引alter或create索引分类(PRIMARY KEY,UNIQUE KEY,FULLTEXT,INDEX)作用查看索引show index from table
  10. C# Cookie工具类
  11. sdut 2493 Constructing Roads (图论)
  12. python操作腾讯文档_python查看文档
  13. Team Foundation Server 开发流程管理管理研讨会
  14. springboot点餐微信小程序毕业设计源码221144
  15. MFCC和语谱图的关系
  16. 小技巧-如何在任何一个文件夹中打开cmd
  17. 基于Spring Boot的校园志愿者服务网站
  18. 【翻译】CEDEC2014跨世代多平台并行开发PS4版如龙维新开发的一年
  19. Python技能树及Markdown编辑器的测评
  20. 博文视点官方博客http://blog.csdn.net/bvbook

热门文章

  1. www服务器提供的第一个信息页面,第14章WWW服务
  2. Paper9:Fast RCNN
  3. C++ 函数参数传递:传值,传指针,传引用
  4. AI玩俄罗斯方块(Python实现)
  5. 深入理解 wpa_supplicant(四)
  6. html脚本语言居中,web前端:CSS--几种常用的水平垂直居中对齐方法
  7. 如何让vue项目打包出来之后更加小巧?
  8. Linux下正确使用getifaddrs()函数避免内存泄露
  9. 使用 Trace32 对 FLASH 编程
  10. 二叉树:二叉搜索树的编码和解码