设置图片透明度的四种方法
2011-07-24 01:13
274 查看
方法一:像素法
即循环扫描整张图片,设置每一个像素的Alpha通道的值。 由于是一个个像素的处理,所以这种方法效率很低。/// <summary> /// 设置图片的透明度 /// </summary> /// <param name="bitmap">原图</param> /// <param name="alpha">透明度(0-255之间)</param> /// <returns></returns> public static Bitmap SetBitmapAlpha(Bitmap bitmap, int alpha) { Bitmap bmp = (Bitmap)bitmap.Clone(); Color color; for (int x = 0; x < bmp.Width; x++) { for (int y = 0; y < bmp.Height; y++) { color = bmp.GetPixel(x, y); bmp.SetPixel(x, y, Color.FromArgb(alpha, color)); } } bitmap.Dispose(); return bmp; }
方法二:内存法
public static Bitmap SetBitmapAlpha(Bitmap bitmap, int alpha) { Bitmap bmp = (Bitmap)bitmap.Clone(); Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); IntPtr ptr = bmpData.Scan0; //获取首地址 int bytes = Math.Abs(bmpData.Stride) * bmp.Height; byte[] argbValues = new byte[bytes]; //复制ARGB的值到数组 System.Runtime.InteropServices.Marshal.Copy(ptr, argbValues, 0, bytes); for (int count = 3; count < argbValues.Length; count += 4) { //设置alpha通道的值 argbValues[count] = (byte)alpha; } System.Runtime.InteropServices.Marshal.Copy(argbValues, 0, ptr, bytes); bmp.UnlockBits(bmpData); bitmap.Dispose(); return bmp; }
方法三:指针法
public static Bitmap SetBitmapAlpha(Bitmap bitmap, int alpha) { Bitmap bmp = (Bitmap)bitmap.Clone(); Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); unsafe { byte* p = (byte*)bmpData.Scan0; int offset = bmpData.Stride - bmp.Width * 4; for (int y = 0; y < bmp.Height; y++) { for (int x = 0; x < bmp.Width; x++) { //设置alpha通道的值 p[3] = (byte)alpha; p += 4; } p += offset; } } bmp.UnlockBits(bmpData); bitmap.Dispose(); return bmp; }
方法四:矩阵法
这个方法的效率最高。/// <summary> /// 设置图片的透明度 /// </summary> /// <param name="image">原图</param> /// <param name="alpha">透明度0-255</param> /// <returns></returns> private Bitmap SetPictureAlpha(Image image,int alpha) { //颜色矩阵 float[][] matrixItems = { new float[]{1,0,0,0,0}, new float[]{0,1,0,0,0}, new float[]{0,0,1,0,0}, new float[]{0,0,0,alpha/255f,0}, new float[]{0,0,0,0,1} }; ColorMatrix colorMatrix = new ColorMatrix(matrixItems); ImageAttributes imageAtt = new ImageAttributes(); imageAtt.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); Bitmap bmp = new Bitmap(image.Width, image.Height); Graphics g = Graphics.FromImage(bmp); g.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageAtt); g.Dispose(); return bmp; }
注意:需要添加命名空间System.Drawing和ystem.Drawing.Imaging。
相关文章推荐
- android开发设置图片透明度的2种方法
- 转:设置图片透明的四种方法
- C#给图片加水印标记(可设置透明度)比上一篇好点,但只有一个方法
- java swing 设置背景图片的方法一
- html5设置圆形图片2种方法
- 禁用U盘的四种常规设置方法
- js实现感应鼠标图片透明度变化的方法
- Qt-Quick中设置组件风格、显示一张图片、在一行显示多张图片的方法、绘制图片方法...
- Android设置桌面背景图片的实现方法
- Unity3d中设置UISprite图片灰显方法
- ios:设置视图背景图片的方法
- iPhone设置视图背景图片的方法
- Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法
- (开发篇) 前端开发~ css设置图片背景透明度
- CSS设置图片居中的方法
- android设置dialog透明度,黑暗度的方法
- 154在屏幕中绘图时设置透明度(扩展知识:为图片视图添加点击手势识别器,来实现点击事件操作)
- UIView设置背景图片的方法
- 四种开机的奇葩方法 设置定时开机
- JS设置网页图片vspace和hspace属性的方法