.NET内置的ImageList 有重大缺陷, 不管是1.1, 还是2.0, 3.0, 3.5版本的都一样: 它对半透明(带alpha通道)的图像支持很差. 最终画出来的图像带有明显的不能接受的锯齿.
google之后发现了一个曾经以为是完美的方案, 依自己乍看之下的效果, 觉得是100%解决的半透明通道图像的问题. 今天一试之下, 发现不尽然, 下面是专门写个小程序试验3种不同做法, 对于同一个文件所能得到的效果, 从左至右依次为Image 1, 2, 3.
显然, 效果3是最完美的. 效果1是通过 AlphaImageListAssigner得到的, 效果2最差, 是通过系统的ImageList提供的方法直接添加Images得到的.
其代码分别如下:
AlphaImageListAssigner
m_imglst_assigner.Images.Clear(); m_imglst_assigner.ImageSize = new Size(bmp.Width, bmp.Height); m_imglst_assigner.ColorDepth = ColorDepth.Depth32Bit; Narbware.Imagelist.AddFromFile(m_txtbox_imgfile.Text, m_imglst_assigner);
e.Graphics.DrawImage(m_imglst_assigner.Images[0], loc1);
|
系统默认效果:
m_imglst.Images.Clear();
m_imglst.ImageSize = new Size(bmp.Width, bmp.Height);
m_imglst.ColorDepth = ColorDepth.Depth32Bit;
m_imglst.Images.Add(bmp);
e.Graphics.DrawImage(m_imglst.Images[0], loc2);
|
直接使用Image:
Bitmap bmp = new Bitmap(m_txtbox_imgfile.Text); e.Graphics.DrawImage(bmp, loc3 );
|
要达到完美的显示效果, AlphaImageListAssigner还不够. 事不目见耳闻, 而宁信其有无. 可乎? AlphaImageListAssigner的效果我可是亲眼见证过, 可是没有跟另外两种的对比, 靠着模糊的印象还是错信它了.
AlphaImageListAssigner 是 codeproject上的一个项目.
其它: Control的Region设置同样会影响到最终的图像效果出现锯齿, 比如一个上图一个圆形的图像, 周围是透明色, 为了实现鼠标只在位于图像内部时生效, 自定义了一个Property来设置一个圆, 这个圆就作为整个控件的Region, 其外形刚好是包罗了整个圆形图像, 没想到这却让一些处于边缘的半透明像素不能被完整的处理, 最终导致不断怀疑其它什么地方出现了bug. 解决办法是牺牲一点点精确性, 把整个Region设置的大一些, 确保完全包罗圆形图像边缘的每个像素.
阅读(710) | 评论(0) | 转发(0) |