ImageList半透明,Alpha通道bug处理。
由于ImageList的先天障碍,对alpha通道支持不好。虽然到xp有所改善,但瑕疵依然存在。
通过reflactor发现ImageList通过windows api来进行读写的。写入数据时会对原始图像进行处理,等到读取时已经获取不到原始图像。鉴于此,只能另起炉灶重新编写一个ImageList,也就是缩略图集合类。
思路:
1,应该有缩略图大小属性,由于添加图像后生成缩略图,并与原始图像断绝关系。所以在有缩略图的情况下不允许修改大小。
2,缩略图集合。可增加图像到集合,添加时按指定大小生成缩略图。可通过索引检索以便调用。删除或清空时要释放生成的资源。
好了,以上就是主题思想。下面是代码。
ImageListEx类代码
/// <summary>
/// 缩略图集合
/// </summary>
public sealed partial class ImageListEx : Component
{
private object m_Tag;
/// <summary>
/// 附加数据
/// </summary>
[DefaultValue(null), TypeConverter(typeof(StringConverter))]
public object Tag
{
get
{
return this.m_Tag;
}
set
{
this.m_Tag = value;
}
} private Size m_Size = new Size(, );
/// <summary>
/// 缩略图大小,只能先设置大小后添加图片
/// </summary>
[DefaultValue(typeof(Size), "32,32")]
public Size ImageSize
{
get
{
return this.m_Size;
} set
{
if (value.Width <= || value.Height <= || this.ImageThumbs.Count > )
return; this.m_Size = value;
}
} private ThumbCollection m_ImageThumbs;
/// <summary>
/// 缩略图,只能先设置大小后添加图片
/// </summary>
[DefaultValue(null), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), MergableProperty(false)]
public ThumbCollection ImageThumbs
{
get
{
if (this.m_ImageThumbs == null)
this.m_ImageThumbs = new ThumbCollection(this); return this.m_ImageThumbs;
}
} /// <summary>
/// 构造函数
/// </summary>
public ImageListEx()
{
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="container">容器</param>
public ImageListEx(IContainer container)
{
container.Add(this);
} /// <summary>
/// 转换为字符串
/// </summary>
/// <returns>字符串</returns>
public override string ToString()
{
string str = base.ToString();
if (this.m_ImageThumbs != null)
{
return (str + " ImageThumbs.Count: " + this.m_ImageThumbs.Count.ToString(CultureInfo.CurrentCulture) + ", ImageSize: " + this.ImageSize.ToString());
}
return str;
} /// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (this.m_ImageThumbs != null)
this.m_ImageThumbs.Dispose(); base.Dispose(disposing);
}
}
ImageListEx.ImageInfo类代码
public partial class ImageListEx
{
/// <summary>
/// 图像信息
/// </summary>
public class ImageInfo
{
private string m_Name;
/// <summary>
/// 名称说明
/// </summary>
[DefaultValue(null)]
public string Name
{
get
{
return this.m_Name;
} set
{
this.m_Name = value;
}
} private Image m_Image;
/// <summary>
/// 图像
/// </summary>
[DefaultValue(null)]
public Image Image
{
get
{
return this.m_Image;
} set
{
this.m_Image = value;
}
} /// <summary>
/// 构造函数
/// </summary>
public ImageInfo()
{
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="name">名称说明</param>
/// <param name="image">图像</param>
public ImageInfo(string name, Image image)
{
this.m_Name = name;
this.m_Image = image;
}
}
}
ImageListEx.ThumbCollection类代码
public partial class ImageListEx
{
/// <summary>
/// 缩略图集合
/// </summary>
public class ThumbCollection : IList, ICollection, IEnumerable
{
private ArrayList m_Thumbs;//缩略图
private ImageListEx m_Owner;//父ImageListEx
private bool m_Disposed;//是否已释放资源 /// <summary>
/// 数量
/// </summary>
public int Count
{
get
{
return (this.m_Thumbs == null) ? : this.m_Thumbs.Count;
}
} /// <summary>
/// 是否为空
/// </summary>
public bool Empty
{
get
{
return (this.Count == );
}
} /// <summary>
/// 是否只读
/// </summary>
public bool IsReadOnly
{
get
{
return false;
}
} /// <summary>
/// 键集合
/// </summary>
public StringCollection Keys
{
get
{
this.CheckDisposed(); StringCollection strings = new StringCollection();
for (int i = , length = this.Count; i < length; i++)
{
ImageInfo imgInfo = this.m_Thumbs[i] as ImageInfo;
strings.Add(imgInfo == null ? null : imgInfo.Name);
}
return strings;
}
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="owner">父ImageListEx</param>
public ThumbCollection(ImageListEx owner)
{
this.m_Thumbs = new ArrayList();
this.m_Owner = owner;
} //创建缩略图
private ImageInfo CreteThumbInfo(ImageInfo value)
{
ImageInfo imgInfo = new ImageInfo();
imgInfo.Name = value.Name;
if (value != null && this.m_Owner != null)
imgInfo.Image = ControlPaintEx.StretchImage(value.Image, this.m_Owner.ImageSize);
return imgInfo;
} //检测是否释放
private void CheckDisposed()
{
if (this.m_Disposed)
throw (new ObjectDisposedException("m_Thumbs"));
} //索引是否在有效范围
private bool IsValidIndex(int index)
{
return ((index >= ) && (index < this.Count));
} #region 自身成员 /// <summary>
/// 添加图像信息
/// </summary>
/// <param name="value">图像信息</param>
public void Add(ImageInfo value)
{
this.CheckDisposed();
this.m_Thumbs.Add(this.CreteThumbInfo(value));
} /// <summary>
/// 添加图像信息数组
/// </summary>
/// <param name="values">图像信息数组</param>
public void AddRange(ImageInfo[] values)
{
this.CheckDisposed();
if (values == null)
throw new ArgumentNullException("values");
foreach (ImageInfo value in values)
this.m_Thumbs.Add(this.CreteThumbInfo(value));
} /// <summary>
/// 清空所有图像信息并释放其使用的临时资源
/// </summary>
public void Clear()
{
if (this.m_Thumbs != null)
{
for (int i = , length = this.Count; i < length; i++)
{
ImageInfo imgInfo = this.m_Thumbs[i] as ImageInfo;
if (imgInfo != null && imgInfo.Image != null)
{
imgInfo.Image.Dispose();
imgInfo.Image = null;
this.m_Thumbs[i] = null;
}
}
this.m_Thumbs.Clear();
}
} /// <summary>
/// 是否包含指定图像信息
/// </summary>
/// <param name="value">图像信息</param>
/// <returns>包含返回true,否则返回false</returns>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool Contains(ImageInfo value)
{
throw new NotSupportedException();
} /// <summary>
/// 是否包含指定key
/// </summary>
/// <param name="key">键</param>
/// <returns>包含返回true,否则返回false</returns>
public bool ContainsKey(string key)
{
return this.IsValidIndex(this.IndexOfKey(key));
} /// <summary>
/// 释放资源
/// </summary>
public void Dispose()
{
if (this.m_Disposed)
return;
this.m_Disposed = true; this.Clear();
this.m_Thumbs = null;
} /// <summary>
/// 获取枚举数
/// </summary>
/// <returns>枚举数</returns>
public IEnumerator GetEnumerator()
{
this.CheckDisposed();
return this.m_Thumbs.GetEnumerator();
} /// <summary>
/// 检索指定图像信息
/// </summary>
/// <param name="value">图像信息</param>
/// <returns>图像信息的索引</returns>
[EditorBrowsable(EditorBrowsableState.Never)]
public int IndexOf(ImageInfo value)
{
throw new NotSupportedException();
} /// <summary>
/// 检索指定key
/// </summary>
/// <param name="key">键</param>
/// <returns>键的索引</returns>
public int IndexOfKey(string key)
{
this.CheckDisposed();
for (int i = , length = this.Count; i < length; i++)
{
if ((this.m_Thumbs[i] as ImageInfo).Name == key)
return i;
}
return -;
} /// <summary>
/// 移除指定图像信息
/// </summary>
/// <param name="value">图像信息</param>
[EditorBrowsable(EditorBrowsableState.Never)]
public void Remove(ImageInfo value)
{
throw new NotSupportedException();
} /// <summary>
/// 移除指定索引的图像信息
/// </summary>
/// <param name="index">索引</param>
public void RemoveAt(int index)
{
this.CheckDisposed();
if (this.IsValidIndex(index))
this.m_Thumbs.RemoveAt(index);
else
throw new ArgumentOutOfRangeException("index");
} /// <summary>
/// 移除指定key的图像信息
/// </summary>
/// <param name="key">键</param>
public void RemoveByKey(string key)
{
int index = this.IndexOfKey(key);
if (this.IsValidIndex(index))
this.m_Thumbs.RemoveAt(index);
} /// <summary>
/// 设置指定索引的图像信息的key
/// </summary>
/// <param name="index">索引</param>
/// <param name="key">键</param>
public void SetKeyName(int index, string key)
{
this.CheckDisposed();
if (!this.IsValidIndex(index))
throw new IndexOutOfRangeException();
if (this.m_Thumbs[index] == null)
this.m_Thumbs[index] = new ImageInfo();
(this.m_Thumbs[index] as ImageInfo).Name = key;
} /// <summary>
/// 获取或设置指定索引的图像信息
/// </summary>
/// <param name="index">索引</param>
/// <returns>图像信息</returns>
public ImageInfo this[int index]
{
get
{
this.CheckDisposed();
if (!this.IsValidIndex(index))
throw new ArgumentOutOfRangeException("index");
return this.m_Thumbs[index] as ImageInfo;
} set
{
this.CheckDisposed();
if (!this.IsValidIndex(index))
throw new ArgumentOutOfRangeException("index");
this.m_Thumbs[index] = this.CreteThumbInfo(value);
}
} /// <summary>
/// 获取指定键的图像信息
/// </summary>
/// <param name="key">键</param>
/// <returns>图像信息</returns>
public ImageInfo this[string key]
{
get
{
this.CheckDisposed();
if ((key != null) && (key.Length > ))
{
int index = this.IndexOfKey(key);
if (this.IsValidIndex(index))
return this.m_Thumbs[index] as ImageInfo;
}
return null;
}
} #endregion #region IList 成员 int IList.Add(object value)
{
if (!(value is ImageInfo))
{
throw new ArgumentException("BadImageInfo", "value");
}
this.Add((ImageInfo)value);
return (this.Count - ); } void IList.Clear()
{
this.Clear();
} bool IList.Contains(object value)
{
return ((value is ImageInfo) && this.Contains((ImageInfo)value)); } int IList.IndexOf(object value)
{
if (value is ImageInfo)
return this.IndexOf((ImageInfo)value);
return -;
} void IList.Insert(int index, object value)
{
throw new NotSupportedException();
} bool IList.IsFixedSize
{
get { return false; }
} bool IList.IsReadOnly
{
get { return this.IsReadOnly; }
} void IList.Remove(object value)
{
if (value is ImageInfo)
this.Remove((ImageInfo)value);
} void IList.RemoveAt(int index)
{
this.RemoveAt(index);
} object IList.this[int index]
{
get
{
return this[index];
}
set
{
if (!(value is ImageInfo))
throw new ArgumentException("BadImageInfo", "value");
this[index] = (ImageInfo)value;
}
} #endregion #region ICollection 成员 void ICollection.CopyTo(Array array, int index)
{
for (int i = , length = this.Count; i < length; i++)
array.SetValue(this.m_Thumbs[i], index++);
} int ICollection.Count
{
get { return this.Count; }
} bool ICollection.IsSynchronized
{
get { return false; }
} object ICollection.SyncRoot
{
get { return this; }
} #endregion #region IEnumerable 成员 IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
} #endregion
}
}
附图:
通过对比可以明显的发现ImageList的alpha通道bug。红框内为ImageList的图像绘制后的效果,其他的图标为ImageLisEx的图像绘制后的效果。
ImageList半透明,Alpha通道bug处理。的更多相关文章
- 什么是Alpha通道?
图像处理(Alpha通道,RGB,...)祁连山(Adobe 系列教程)****的UI课程 一个也许很傻的问题,在图像处理中alpha到底是什么? Alpha通道是计算机图形学中的术语,指的是特别的 ...
- 窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)
参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提 ...
- 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- Alpha通道
Alpha通道是计算机图形学中的术语,指的是特别的通道,意思是“非彩色”通道,主要是用来保存选区和编辑选区.真正让图片变透明的不是Alpha 实际是Alpha所代表的数值和其他数值做了一次运算 为 ...
- alpha通道与混合技术
Alpha其作用是要实现一种半透明效果. 假设一种不透明的东西颜色是A,另一种透明的东西颜色是B,那么透过B去看A,看上去的颜色C就是B与A的混合颜色.设置B的透明度为alpha(取值为0-1,0为完 ...
- 带Alpha通道的色彩叠加问题
css3的rgba色彩模式.png/gif图片的alpha通道.canvas的rgba色彩模式.css3的阴影.css3的opacity属性等等,这些应用在网页中,有意无意间,我们的页面多了许多半透明 ...
- 窗体的Alpha通道透明色支持
参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提 ...
- PIE SDK Alpha通道数据渲染
1. 功能简介 在计算机图形学中,一个RGB颜色模型的真彩图形,用由红.绿.蓝三个色彩信息通道合成的,每个通道用了8位色彩深度,共计24位,包含了所有彩色信息.为实现图形的透明效果,采取在图形文件的 ...
- Alpha通道是什么意思,和rgb通道有什么区别
Alpha通道是什么意思,和rgb通道有什么区别 Alpha通道: 阿尔法通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域,其中白表示不透明,黑表示 ...
随机推荐
- CardsTube/YouTubePlaylist
CardsTube https://github.com/DesarrolloAntonio/CardsTube YouTubePlaylist https://github.com/akoscz/Y ...
- Java基础知识强化之IO流笔记56:IO流练习之 登录注册IO版
1. 登录注册IO版的Java项目框架,如下: 2. 具体代码实现: (1)User.java(cn.itcast.game): package cn.itcast.pojo; /** * 这是用户 ...
- C#知识总结
Control类属于Sytem的命名空间 表示控制台标准的输入输出和错误流提供用于从控制台读取单个字符或正行的方法还提供了很多写入的的方法, static 关键字是对方法的修饰 二 数据类型的分类 数 ...
- 利用Qt制作一个helloworld
使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4 ...
- DevExpress GridControl 列中显示图片
一.GridControl 的Columns中添加列 1.列名:FieldName命名为img 2.类型:ColumnEdit属性中 选择PictureEdit类型(RepositoryItemPic ...
- 在VM虚拟机中安装centos7
- c# winform实现网页上用户自动登陆,模拟网站登录
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO ...
- NewtonSoft.json 序列化和反序列化实例
在百度 API Store 找个旅游的 API 来当成本次 Demo 的例子 接口地址:http://apis.baidu.com/apistore/attractions/spot AIPKEY: ...
- JAVA多线程解惑之多线程返回值
如果有人问题你,多线程可以有返回值吗?你怎么回答? 看下面例子,我定义了一个类实现了Callable 接口 public class MyCallable implements Callable< ...
- Ext.Net学习笔记08:Ext.Net中使用数据
之前的七篇文章都是介绍Ext.Net较为基础的东西,今天的这一篇将介绍数据的一些用法,包括XTemplate绑定数据.Store(Modal.Proxy).ComboBox的用法等. XTemplat ...