.NET 中关于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中的截图:
要 出来这个效果还有一点是必需的, 就是上图中红线框起来的两行, 语句简单, 但里面的内在机制比较复杂, 这两行必需出现在任何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中的透明效果出来了, 虽然图像小小的怎么都看不清楚.
.NET 中关于ImageList 图片锯齿问题相关推荐
- 消除ImageList 图片锯齿
.NET之前, 微软乃至微软之外的公司/软件已经以极好的效果处理图片了, 包括对Alpha通道的支持, .NET是后来者, 但是先天却对这个支持不足. 说这话时, 我用的已经是VS2008, 看 ...
- android图片缓存,直接应用项目中的Android图片缓存技术
前不久搞的Android图片缓存,刚开始引入开源的框架,用着还行,但是在开发中遇到问题,就比如universal-image-loader-1.9.5.jar这个框架吧,在加载图片的时候自定义imag ...
- html怎么消除文字锯齿,html – 如何在网页中做字体抗锯齿?
实际上并没有一个很好的跨平台的方式来强制客户反对别的文字,这一般是重要的.客户端可以决定如何渲染文本,因为操作系统的图形功能差异很大,有些人可能希望禁用抗锯齿功能,以提高性能(例如,在较旧的Windo ...
- 在Word文档中插入矢量图片
在Word文档中插入矢量图片 在 Word 文档中插入矢量图片,可以按照以下步骤进行: 打开 Word 文档,点击插入选项卡,选择"图片"命令. 在弹出的"插入图片&qu ...
- 前端开发中常用的图片格式
在我们的日常开发中.必不可少会使用很多种图片. 我们需要根据业务场景来选择所使用的图片类型. 这里我整理了一些常用图片类型.他们的优缺点以及建议的使用场景. 如何在计算机中显示一张图片 我们使用的计算 ...
- jdbc mysql查询显示图片_JDBC【向数据库中存入读取图片】
JDBC-向数据库中存入读取图片 注:此代码依赖自定义的数据库连接工具类 1.向数据库存入一张照片 import java.io.File; import java.io.FileInputStrea ...
- 解决Chrome中UEditor插入图片的选择框加载过慢问题
解决Chrome中UEditor插入图片的选择框加载过慢问题 ../resources/plugins/ueditor/ueditor.all.js 中line24489/24498中的 accept ...
- R语言ggplot2可视化使用ggplot2包patchwork包在可视化结果(右上角)中插入logo图片
R语言ggplot2可视化使用ggplot2包patchwork包在可视化结果(右上角)中插入logo图片 目录
- ubuntu中命令打开图片、文档、音乐、视频等
ubuntu中命令打开图片.文档.音乐.视频等 安装播放软件 sudo apt install libdvdnav4 libdvdread4 gstreamer1.0-plugins-bad gstr ...
最新文章
- 程序员,什么是高手?什么是低手?
- torch topk
- html和css学习,HTML与CSS学习小结
- python调用打印机驱动下载_selenium的Python使用(一)浏览器驱动的安装及使用
- 如何不用服务器来开发一个小游戏
- JavaScript面向对象——多继承的实现与理解
- C++中的空类,默认产生哪些类成员函数?
- Git撤销文件的修改(git checkout -- file)(git reset HEAD file)(git reset HEAD~)
- 复旦大学邱锡鹏教授《神经网络与深度学习》最新版更新!
- 引发了未经处理的异常:读取访问权限冲突_从零开始学Python:23课-文件读写和异常处理
- C语言三位数的整数立方和,c语言求一个三位数正整数n各个数位上数据的立方和...
- EAS BOS 后台事务定义步骤
- 免费的局域网文档协作办公方式—onlyoffice文档协作
- 4K工业级高清4进1出HDMI自动USB KVM多电脑切换器(MT-HK401)
- 产品上线前,友谊的小船说翻就翻!
- 玩转iOS开发:iOS 10 新特性《Siri Kit》
- 安卓 获取机身内存,可用内存;运行内存,剩余内
- 经典同态加密算法Paillier解读 - 原理、实现和应用
- IC人物志-冯·诺依曼54年传奇:上帝让他开挂?
- 动画讲算法,终于来了!