在.net中使用GDI+来提高gif图片的保存画质
//本文章有www.blue1000.com翻译,原文地址http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx
//尊重他人劳动成果,转载请注明出处。
写程序的时候经常用到gdi+,他可以将一幅深色32 bpp图像保存为一个gif文件,过程也比较简单。并且在使用CreateThumnailImage方法保存这个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);
}
效果图片如下(是不是漂亮多了?):
相关文章:

随记:kickstart远程批量无人值守安装linux
环境:RHEL6.2组件:dhcp tftp vsftp kickstart原理:需安装linux的客户机通过PXE方式启动;通过dhcp取得IP地址;通过TFTP下载引导进程文件pxelinux.0,内核文件vmlinuz,底层驱动initrd.img&…

第五届全国大学生计算机系统能力培养大赛 | 赠书
全国大学生计算机系统能力培养大赛是由教育部高等学校计算机类专业教学指导委员会和系统能力培养研究专家组共同发起,以学科竞赛推动专业建设和计算机领域创新人才培养体系改革、培育我国高端芯片及核心系统的技术突破与产业化后备人才为目标,面向高校大…

玉山银行的一名新员工“玉山小i随身金融顾问”
市场竞争、监管变化、客户体验一直在对金融行业发起挑战,所以无论监管、竞争、客户都会影响金融行业在成本和服务上的创新,金融行业越来越多的开始利用人工智能去满足现有发展提出的要求。 台湾玉山银行的数字化转型就是一个很好的例子。台湾有一句顺口溜…

DataGridView 密码列(显示为*号)的设置
曾经为在DataGridView中设置密码列(显示为*号)而发愁,如何把Windows 窗体 DataGridView 的某一列的数据显示为“*”。 哈哈,今天终于搞定了。需要在DataGridView的2个事件中写代码真麻烦!下面的代码把第4列设置为密码…

在Android中进行单元测试遇到的问题
问题1、Cannot connect to VM socket closed 在使用JUnit进行测试的时候,遇到这个问题。网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还是本地JVM都会进行Socket通讯.发生这样的错误是由于这些软件会修改winsock,还会监听和占用一些端口&…

英特尔第三代 Ice Lake 发布正面与 AMD EPYC PK,结果令人大跌眼镜!
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 导读:传闻已久的第三代英特尔至强可扩展处理器,终于在北京风光最美的4月份发布了。 北京时间4月7日晚,在著名的网红打卡地,百年老首钢工厂遗留下的工业建筑…

荣之联“云桥OneBridge”让IT运维事半功倍
近日,荣之联发布“云桥OneBridge”新一代的轻量级企业用户账号管理平台,为企业提供账号全生命周期管理解决方案。“云桥OneBridge”让IT运维工作效率大幅提升,并降低人为差错率,IT运维从此事半功倍。 据介绍,北京荣之联…

自定义GridView分页模板
GridView较之DataGrid提供了更加强大、更加完善的功能,而且具备了丰富的可扩展功能,可以使用GridView提供的pagertemplate自定义分页模板: 事实上,GridView默认的几中分页样式,都是将相关按钮的CommandName设为Page&a…

“雾霾”天里坐看云起时-【软件和信息服务】2014.01
2013年是中国关注雾霾的元年,中国经济高速发展了30多年后,我们终于幡然醒悟:雾霾和各种污染也开始正式进入公众和各级政府的视野。VMware在12月6日召开的VSS上海站并没有因为雾霾肆虐而降低热度,IT界在雾霾天里继续着云中漫步。20…

CSDN 给你一个薅羊毛的机会!你真的不要吗?
抢红包、集福卡、转锦鲤等等,每年过年过节,各种价值几十亿的瓜分活动,对于网络冲浪选手来说,眼花缭乱但也乐趣满满。可现实是:你抢了5毛8,人家抢了好几万!甚至前段时间,字节跳动安全…

ASP.NET TricksTip:关于Tooltip(title)的换行问题
我们知道,为了使对于普通 HTML 元素的title可以换行,至少可以有可以两种方式: 1。将title的文本分行写 <a href"#" title"helloworld">hello world</a>2。插入换行符号 <a href"#" title&q…

谷歌高管又变动:AI 研究部门元老即将离职
整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI科技大本营(ID:rgznai100)本周二,谷歌研究院负责人 Samy Bengio 宣布辞职。Samy Bengio 在公司内部邮件中表示自己决定离开谷歌,并将于 4 月 28 日正式离职。目前,Samy Be…

jQuery 1.9 移除了 $.browser 的替代方法
$.browser是通过正则表达式来匹配userAgent来判断浏览器版本和种类的.jquery1.3.2版本的文档中已经声明jquery.browser及jquery.browser.version建议弃用,可以使用jquery.support来代替。jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version &a…

异常检测算法:Isolation Forest
iForest (Isolation Forest)是由Liu et al. [1] 提出来的基于二叉树的ensemble异常检测算法,具有效果好、训练快(线性复杂度)等特点。 1. 前言 iForest为聚类算法,不需要标记数据训练。首先给出几个定义&am…

asp.net 2.0中的弹出对话框
在asp.net 1.1中,要做1个弹出的对话框的话,一般是在服务端的代码中这样写: btnClick.Attributes.Add("onclick", "return confirm(Are you sure?);"); 现在在ASP.NET 2.0中,只要使用客户端的代码就可以拉&a…

2014学习目标
学习目标 给自己定一个学习计划,省着没有目的瞎弄。 整理javascript基础,记录博客(进行中......)学习jquery源码,培养自己的实战技巧学习nodejs,充实自己,记录博客学习git的使用,记录…

2021全球最具影响力 AI 学者榜单: 中国占比11.1%,位列第二
2021 年 4 月 8 日,2021 年人工智能全球最具影响力学者——AI 2000 榜单重磅揭晓。AI 2000 榜单由清华大学 AMiner 联合北京智源人工智能研究院、清华 - 中国工程院知识智能联合研究中心共同发布,旨在通过 AMiner 学术数据在全球范围内遴选过去十年人工智…

BootStrap 模态框禁用空白处点击关闭
转自(http://www.cnblogs.com/DayDreamEveryWhere/p/4550320.html) 模态框为信息编辑窗口,涉及好多内容,填了半天,若一不小心点了空白处..... $(#myModal).modal({backdrop: static, keyboard: false}); backdrop:static时,空白处不关闭. keyboard:false…

asp.net 2.0中设定默认焦点按钮
在asp.net 1.1中,当要在page_load页面中,设置某个控件为默认的焦点按钮(也就是默认焦点是在这个控件上的),可能要用到javascript的代码,而在ASP.NET 2.0中,不用这些麻烦了,在form代码…

(送)Java 架构技术揭秘:Redis+Nginx+Dubbo精选+面试题+精选视频
最近花了很长的时间去搜罗整理Java核心技术好文,我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给小伙伴们,也能为小伙伴们省去不少麻烦,想学什么技能了,遇到哪方面的问题了 直接打开文档学一学…

Twitter的应急预案、部署流程
2019独角兽企业重金招聘Python工程师标准>>> 《空中之城》事件 在构建Twitter的架构和系统时,我们是以周为单位来确定那些系统的性能的,我们能清楚地知道每个服务维度的系统理论容量,从而尝试去了解整个系统的理论容量。基于这些信…

新产品发布与A轮2000万美元 双喜临门后GrowingIO还要做什么
ZD至顶网CIO与应用频道 06月29日 北京消息(文/王聪彬):一个用户一天可能会打开超过12个App,但其中只有3个App的使用时间超过80%。这反映了大多数人使用手机的现状。 透过现象看本质,中国互联网、移动互联网市场既有人口…

gridview列 数字、货币和日期 显示格式
形式语法结果注释数字{0:N2}12.36 数字{0:N0}13 货币{0:c2}$12.36 货币{0:c4}$12.3656 货币"¥{0:N2}"¥12.36 科学计数法{0:E3}1.23E001 百分数{0:P}12.25%P and p present the same.日期{0:D}2006年11月25日 日期{0:d}2006-11-25 日期{0:f}200…

打造专属BGM,Python 深度学习教你
作者 | 李秋键头图 | 下载于视觉中国出品 | AI科技大本营(ID:rgznai100)音乐文字,组合食用,效果更佳。引言:“那些听不到音乐的人,以为跳舞的人疯了。” 尼采这句话好有趣,也告诉我们音乐对于日…

XML 特殊字符处理和 CDATA
在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆。 所有 XML 文档中的文本均会被解析器解析。 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。 PCDATA PCDATA 指的是被解析的字符数据(Parsed Charac…

zookeeper集群环境搭建
2019独角兽企业重金招聘Python工程师标准>>> 至少3台zookeeper:第一台:con/zoo.cfgtickTime2000 initLimit10 syncLimit5 dataDirC:\\Users\\Administrator\\Desktop\\Zookeepers\\zookeeper-3.4.6.1\\data dataLogDirC:\\Users\\Administrator\\Desktop\\Zookeeper…

ASP.NET遍历配置文件的连接字符串
在ASP.NET 2.0中,提供了更方便的配置文件访问的类,具体可以到 System.Configuration 名称空间下进行查看。本文提供一种在开发过程中常用的得到数据库字符串的方法,为方便使用,写成一个方法进行调用: public string Ge…

#define WIN32_LEAN_AND_MEAN 的作用
[转]#define WIN32_LEAN_AND_MEAN 的作用 今天看了用mysql的库vc连接数据库,结果我用mfc application向导建立一个工程,然后添加#include "mysql.h"(已经设置好了环境),编译出现了一大堆错误,如下 Compiling...StdAfx.cppc:mysqlincludemysql_com.h(116) : error C21…

《头号玩家》中的“绿洲”,用 VR 可以找到
图源:百度百科出品 | AI科技大本营(ID:rgznai100)2045年,现实世界令人失望,人们将救赎的希望寄托于“绿洲”,一个虚拟游戏宇宙。人们只要戴上VR设备,就可以进入这个与现实形成强烈反差的虚拟世界…
Android开发之程序猿必需要懂得Android的重要设计理念2(5.20更新版)
上篇文章介绍了Android开发的设计理念的一部分,并没有得到博友们的多大认可,仅仅看到了一位博友在以下留言期待下一篇文章的发表,为了这小小的唯一支持。我决定继续把后面的8个要点介绍一下,自己也潜心反省一下,自己的…