Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2314805
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-07-15 22:36:55

.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设置的大一些, 确保完全包罗圆形图像边缘的每个像素.

阅读(653) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~