消除ImageList 图片锯齿
.NET之前, 微软乃至微软之外的公司/软件已经以极好的效果处理图片了, 包括对Alpha通道的支持, .NET是后来者, 但是先天却对这个支持不足.
说这话时, 我用的已经是VS2008, 看一下在VS2008本身里面打开calc.exe(计算器)的效果:
看见最后三个图标的黑边没有, 操作系统本身显示这样的图标时绝不是这个效果, 第三方软件如Icon Workshop专门处理图标的, 对这个的支持自然也很完美.
我是在解决一个程序界面上一个看似bug的不完美之处时左冲右突最后阴差阳错在VS2008 中打开calc.exe时看到这个效果的, 正是因为这个效果, 让我开始怀疑这是.NET本身的bug所致.
果然, google结果都证实了这一点, 在.NET中 ImageList被广泛用来管理和显示ListView 等众多控件中的图像相关资源. 但是通过.NET form designer来给ImageList添加图像时, 其Alpha通道会被错误处理, 并不是简单地丢失或忽略, 而是看上去有部分的支持. 即对半透明的像素它给处理成完全不透明了. 对安全透明的像素还是可以正确处理的, 最终的视觉效果就是一些图标的边缘有锯齿效果, 很粗糙.
code project上两个文章分别解决了关于ImageList的两个不怎么相关的问题.
其一就是解决ImageList的内置Add 方法错误处理Alpha通道的. 地址在:
http://www.codeproject.com/KB/miscctrl/AlphaImageImagelist.aspx
解决的很好, 充分考虑了各种向ImageList添加图像的来源, 图像文件, Assembly中的内嵌资源. 缺点有这么几个:
1. 跟Form Designer的机制脱节, 可以在代码里通过它提供的接口向ImageList 添加图像资源--完美保留ALpha通道, 但是在设计期跟你的ImageList的内容是不相关的, 它没办法让你在设计期就能看到ImageList中添置好的图像资源, 也因此让你的其它控制无法选取该资源, 比如一个Button选择ImageList中的某个图像作为其背景, 这没法办到, 除非你另外通过Form Designer向ImageList中添加资源--- 但这个资源无疑是不能正确包含Alpha通道的. 你得手工保证运行期 ImageList中通过该控制添加的内容与设计期开发者看到的效果是一致的, ImageIndex 尤其要保证, 对于.NET 2.0而言, 还得保证ImageKey.
2. 通过Assembly内嵌资源添加图像时, 接口如下:
public static void AddEmbeddedResource( string resourceName, ImageList destinationImagelist);
第一个是资源名, 第二个参数是ImageList(的引用).
该函数在内部确定嵌入了该资源的Assembly是:
Assembly.GetExecutingAssembly().GetManifestResourceStream( resourceName );
这就带来了一个问题, 如果希望这个可重用的组件独立编译在一个DLL中, 从而被其它众多项目共用的话, 那些图像资源往往是嵌入在那些使用它的项目的目标Assembly中, GetExecutingAssembly()则永远返回当前正在执行的那么指令所置身其中的那个Assembly, 也就是你独立编译出来的DLL中, 所以这样来得到Assembly是不行的, 我对它的一点改动是:
public static void AddEmbeddedResource(Assembly assembly, string resourceName, ImageList destinationImagelist);
多传进来一个Assembly参数. 这样调用者可以决定资源是在哪个Assembly中的.
再看第二个项目:
http://www.codeproject.com/KB/selection/ImageListAssigner.aspx
它解决的是在.NET的Form designer中, 默认的ImageList编辑器不好用的问题, 它集成到.NET 的Form designer中, 提供了一个确实更好用更方便的编缉器.
但是, 它丝毫没有触及第一个项目中解决的Alpha通道问题.
现在, 两位作者确实都解决了ImageList的一些方便, 是站在他们肩膀上的时候了.
把两个项目一结合, 略加修改, 就得到了一个比.NET Form Designer中内置的ImageList编辑器更好用的可视界面, 而且完美支持图像的Alpha通道. 不过严格说, 离完美还差一点, 下面的截图中会看到, 程序的最终运行效果是好的, 但在Form Designer中开发者在设计时看到的却差一些, 这总比事情反过来好, 开发者看到的效果再好, 如果程序运行时最终用户看到的更差, 那等于没做.
下面是VS.NET 2003中的截图:
一脸麻点的窗口自然是设计时的Form Designer窗口, 可以看到Alpha通道被处理的很差, 显示为全黑色, 而那个ImageListAssigner窗口显示的也是一样, 最上层的窗口显示的是实际运行时的效果, 透明效果完全出来了.
要出来这个效果还有一点是必需的, 就是上图中红线框起来的两行, 语句简单, 但里面的内在机制比较复杂, 这两行必需出现在任何UI代码运行之前. 而且, 无论是对VS2003还是VS2008都必需这样, 有另外一个work around的办法替代这红框里的现行代码是, 使用manifest文件. 这儿不多说这个.
下面的是VS2008中的效果:
可以看到在Form Designer设计时边缘效果比较差(但比VS2003好一些, 那个是完全的黑框), 但ImageListAssigner窗口和和运行时其效果都是完美的.
有一个极小的细节: 在一个特殊的时刻, VS2008 即使是Form Designer中也可以显示出完美的透明效果, 那就是 ImageListAssigner窗口的 "Apply"刚刚被点击之后, 此时VS.NET得到了一个ImageList, 其中的图像的Alpha通道是ImageListAssigner 刚刚做好新出炉的, 但是, 重新rebuild项目或其它一些操作, 会引发VS.NET从资源中的base64编码重新生成ImageList, 边缘锯齿就又回来了, 回来不要紧, 因为这只是从resx资源到VS.NET内部使用的ImageList的单向流动, 千万不要造成VS.NET再把这个ImageList写回resx中, 那时透明效果就会又被它搞砸锅.
通过ImageListAssigner 来编辑ImageList之后,
在属性窗口和ImageList的编辑器中, VS2008的显示也更好一些:
08中的透明效果出来了, 虽然图像小小的怎么都看不清楚.
消除ImageList 图片锯齿相关推荐
- .NET 中关于ImageList 图片锯齿问题
.NET之前, 微软乃至微软之外的公司/软件已经以极好的效果处理图片了, 包括对Alpha通道的支持, .NET是后来者, 但是先天却对这个支持不足. 说这话时, 我用的已经是VS2008, 看一下在 ...
- [css] css如何消除字体的锯齿?
[css] css如何消除字体的锯齿? -webkit-font-smoothing:antialiased; 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家 ...
- 如何消除图片锯齿 html,Html5 canvas drawImage图片抗锯齿
Html5 canvas drawImage图片抗锯齿2018-01-26 11:17 虽然drawImage会自动应用消除锯齿,但如果是从大尺寸变为小尺寸,某些图像就不尽人意了,比如曲线. 对于可能 ...
- 关于图片锯齿产生的原因和如何消除
在Android中,锯齿产生的原因,目前我知道有两种: 1. 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿. 2.在用View的RotateAnimation做动画时候, ...
- Python下应用opencv 背景消除或图片减法
背景消除或背景减法是这样一种假设.我们有2个图片,一个是静止的,比如场景,没有需要检测的东西,另一个照片则包含了要检测的对象,但他是侵入了背景里的东西,或对象.我们就是要检测这个东西,比如商场进入的小 ...
- android 图片锯齿,在Android上禁用消除锯齿Imageview
我在图像查看中显示96x96像素的艺术精灵,无法应用消除锯齿(或至少某种形式的插值,如果它不是抗锯齿),这破坏了精灵的尖锐边缘.在Android上禁用消除锯齿Imageview 这怎么办?我已经尝试了 ...
- css图片锯齿,CSS 锯齿实现
使用before和after伪元素的border实现 左右和上下锯齿, 左右锯齿实现 .sawtooth { /* 相对定位,方便让before和after伪元素绝对定位偏移 */ position: ...
- 影像的拼接及消除拼接处锯齿状的图斑
基于地理参考的图像镶嵌 1.Map--Mosaicking--Georeferenced. 2.两幅图像要具有相同的波段组合和顺序. 文件列表中排在下面的文件,在图像窗口中显示在上面 3.图像重叠设置 ...
- java 缩放图片 锯齿_Java Image Filters 图像缩放质量差的问题解决
Java Image Filters 提供一个用来处理图像缩放的 Filter 类:ScaleFilter,用法如下: BufferedImage bi_src = ...; ImageIO.writ ...
最新文章
- ubuntu12.04下NFS链接开发板并测试交叉编译的第一个应用
- 【Python】圆周率的计算
- vue-cli起服务chrome不能打断点——每周汇总(第一周)
- 汉王拉开人脸识别产业化大幕 市场应用前景广阔
- 为什么部分Android用户不喜欢用iOS系统?
- 小数据、高准确率的文本分类:利用迁移学习创造通用语言模型
- 把图片url 伪静态 php,thinkphp5系列之URL伪静态(生成优雅的URL)
- 天天生鲜页面设计——网站首页
- 微信终于要对聊天记录动手了?
- java-时间间隔类period类和Duration类
- android web 爬虫,Android学习——Jsoup实现网络爬虫,爬取贤集网
- 2021年,小灰都读了哪些书?
- android 5.1 随机IMEI号
- 要「自我颠覆」的华为Mate 10来了
- 驼峰命名法(CamelCase)和下划线命名法(UnderScoreCase)
- 【Three.js入门】灯光与阴影、平行光阴影属性、聚光灯的属性和应用
- 邮件内容以html形式,如何以邮件的形式发送HTML文件?
- Linux环境下Font font = new Font(黑体, Font.BOLD, 18)[BufferedImage~Graphics~drawString]中文乱码
- 学做网站有哪些注意事项(上)
- 移动客户端设计开发经验-流程篇
热门文章
- iOS开发——加载、滑动翻阅大量图片解决方案详解
- java hadhoop如门pdf_《Hadoop实战》PDF 下载
- 中关村高新技术企业名单
- Centos8、Centos7解决Ens33网卡不显示IP地址的问题。
- 计算机外文翻译旅游网站,在线旅游外文文献翻译最新译文资料
- 手机耗电统计app_Android O 新特性:精确统计 APP 电量消耗
- 计算机电源测试电压,使用万用表测试电脑电源好坏的方法
- 1079. 活字印刷
- 左右手材料,左右手传输线
- python 16.1 继承 重写 supper()方法 多重继承