作者: 小红帽
查看: 7911|回复: 18
打印 上一主题 下一主题

【特效算法】仿QQ登录窗口渐变透明算法

[复制链接]
跳转到指定楼层
楼主
小红帽 发表于 2014-7-30 10:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 7911|回复: 18
本帖最后由 小红帽 于 2014-7-30 14:09 编辑

LayeredSkin的渐变透明动画特效就是采用该算法实现的,使用案例已添加!

腾讯QQ的效果是一块块的



[C#] 纯文本查看 复制代码
        /// <summary>
        /// 渐变透明
        /// </summary>
        /// <param name="srcImage">原图</param>
        /// <param name="rect">需要渐变处理的区域</param>
        /// <param name="direction">渐变方向透明到不透明 0:上到下,1:下到上,2:左到右,3右到左</param>
        /// <returns></returns>
        public static Image GradualAlpha(Image srcImage, Rectangle rect, int direction)
        {
            Bitmap bmp = new Bitmap(srcImage);
            double opacity = 1;//不透明度的百分比

            //LockBits将Bitmap锁定到内存中
            BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            unsafe
            {
                //p指向地址
                byte* p = (byte*)data.Scan0;//8位无符号整数
                int offset = data.Stride - rect.Width * 4;
                for (int y = 0; y < rect.Height; y++)
                {
                    if (direction == 0)
                    {
                        opacity = 1.0 * y / (rect.Height - 1);
                    }
                    else if (direction == 1)
                    {
                        opacity = 1 - 1.0 * y / (rect.Height - 1);
                    }

                    for (int x = 0; x < rect.Width; x++)
                    {
                        if (direction == 2)
                        {
                            opacity = 1.0 * x / (rect.Width - 1);
                        }
                        else if (direction == 3)
                        {
                            opacity = 1 - 1.0 * x / (rect.Width - 1);
                        }
                        p[3] = (byte)(p[3] * opacity);//对像素设置Alpha
                        p += 4;
                    } // x
                    p += offset;
                } // y
            }
            bmp.UnlockBits(data);//从内存中解除锁定
            return bmp;
        }

效果图:







案例代码:把这些代码添加到Form里面,需要
using System.Drawing.Imaging;
以及允许不安全代码

[C#] 纯文本查看 复制代码
       protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            this.BackColor = Color.Lime;
            this.BackgroundImage = GradualAlpha(Image.FromFile("E:\\图片\\25011G41R3.jpg"), new Rectangle(30,150,300,100), 3);
        }

        /// <summary>
        /// 渐变透明
        /// </summary>
        /// <param name="srcImage">原图</param>
        /// <param name="rect">需要渐变处理的区域</param>
        /// <param name="direction">渐变方向透明到不透明 0:上到下,1:下到上,2:左到右,3右到左</param>
        /// <returns></returns>
        public static Image GradualAlpha(Image srcImage, Rectangle rect, int direction)
        {
            Bitmap bmp = new Bitmap(srcImage);
            double opacity = 1;//不透明度的百分比

            //LockBits将Bitmap锁定到内存中
            BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
            unsafe
            {
                //p指向地址
                byte* p = (byte*)data.Scan0;//8位无符号整数
                int offset = data.Stride - rect.Width * 4;
                for (int y = 0; y < rect.Height; y++)
                {
                    if (direction == 0)
                    {
                        opacity = 1.0 * y / (rect.Height - 1);
                    }
                    else if (direction == 1)
                    {
                        opacity = 1 - 1.0 * y / (rect.Height - 1);
                    }

                    for (int x = 0; x < rect.Width; x++)
                    {
                        if (direction == 2)
                        {
                            opacity = 1.0 * x / (rect.Width - 1);
                        }
                        else if (direction == 3)
                        {
                            opacity = 1 - 1.0 * x / (rect.Width - 1);
                        }
                        p[3] = (byte)(p[3] * opacity);//对像素设置Alpha
                        p += 4;
                    } // x
                    p += offset;
                } // y
            }
            bmp.UnlockBits(data);//从内存中解除锁定
            return bmp;
        }


运行效果图






评分

参与人数 1金钱 +1 收起 理由
乔克斯 + 1 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播
回复 论坛版权

使用道具 举报

沙发
乔克斯 发表于 2014-7-30 11:31:07 | 只看该作者
>A<很不错啊~nice~~
板凳
乔克斯 发表于 2014-7-30 11:31:40 | 只看该作者
最好把案例也附加上哦~
地板
天天向上 发表于 2014-7-30 12:29:34 | 只看该作者
GOOD~~需要案例.
5#
佐佑 发表于 2014-8-1 21:58:03 | 只看该作者
截图难度5颗星。。。
6#
乔克斯 发表于 2014-8-1 23:29:45 | 只看该作者
佐佑 发表于 2014-8-1 21:58
截图难度5颗星。。。

噗哈哈~这都被你发现了。。
7#
Blue_Pen 发表于 2014-8-6 09:07:58 | 只看该作者
拿走,不解释
8#
gharbor 发表于 2014-9-22 22:02:54 | 只看该作者
没DEMO吗!????
回复

使用道具 举报

9#
 楼主| 小红帽 发表于 2014-9-23 09:53:43 | 只看该作者
gharbor 发表于 2014-9-22 22:02
没DEMO吗!????

不是有案例代码吗? 如果你想要QQ登录窗体Demo在这里下载  http://bbs.cskin.net/thread-281-1-1.html
10#
Johnnie 发表于 2014-10-8 00:04:15 | 只看该作者
锄禾日当午
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-4-20 17:41, Processed in 0.648447 second(s), 34 queries , Gzip On.

快速回复 返回顶部 返回列表