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级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域,其中白表示不透明,黑表示 ...
随机推荐
- [置顶] Ubuntu 12.04中文输入法的安装
Ubuntu 12.04中文输入法的安装 Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等.其中Scim和Ibus是输入法框架. 在Ubuntu的中 ...
- Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序
Citrix服务器虚拟化之三十 XenApp 6.5发布流式应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这 ...
- java实现window phone推送通知
package com.windowphone.text; import java.io.IOException;import java.io.OutputStream;import java.net ...
- 谋哥:App排行榜的秘密
App在改变世界,改变人们的生活. 如今购物大家都用淘宝.京东,吃饭你会用饭否,看天气预报你用墨迹天气,看视频用优酷.K歌你用唱吧,聊天联系你用微信,看新闻你用今日头条等等.你的生活由你自 ...
- block_dump观察Linux IO写入的具体文件(mysqld)
一.使用方法: 二.基本原理: 三.总结 很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹 ...
- 原创 C# 正则表达式 读写 Ini 文件
昨天遇到读ini文件的问题,我知道C#里没有提供相应的类,所有的.net配置都是xml方式存储的. 读取ini文件,很多人直接google一把,然后添加dll引用.介绍的比较详细的,如: C#如何读写 ...
- linux atime ctime mtime
touch testtime 1. stat testtime[为文件名] 可以查看这个文件名的三者状态 2.ll testtime;ll --time=atime testtime ;ll --ti ...
- html笔记05:html、css、javascript综合案例
1.首先是html代码: <!-- markup time --> <div class="wrapper wb"> <div class=" ...
- javascript变量提升
提升是一种将变量和函数的声明移到函数作用域(如果不在任何函数内的话就是全局作用域)最顶部的机制. 提升影响了变量的生命周期,一个变量的生命周期包含3个阶段: 声明——创建一个新变量,例如var myV ...
- C#基础篇01
vs20vs2013快捷键小节: 1>: #region #endregion(用来折叠冗余代码) 2>:Ctril+K+D快速对其代码: 3>:Ctril+K+C注释选中代码 Ct ...