wpf 图片灰度处理的问题

zmidl 2018-02-05 04:28:58
如题我要把带有透明背景的图片 类似png ico 图片灰度处理成黑白图片 然而网上一些代码都是把 透明背景都变成黑色了。如何处理彩色图片和黑白图片切换后 不影响透明背景呢?望懂得朋友指点一下。
...全文
563 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmidl 2018-03-01
  • 打赏
  • 举报
回复
引用 1 楼 zhuo_wp 的回复:
这个跟wpf没什么关系。 直接采用内存法,读入图片数据的时候读取图片的argb数据而不是单纯的rgb数据
        private void GrayImage(string fileName)
        {
            Bitmap bitmap = (Bitmap)Bitmap.FromFile(fileName, false);
            if (bitmap != null)
            {
                //位图矩形
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height);
                //以可读写的方式将图像数据锁定
                System.Drawing.Imaging.BitmapData bmpdata = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                //得到图形在内存中的首地址
                IntPtr ptr = bmpdata.Scan0;

                //构造一个位图数组进行数据存储
                int bytes = bitmap.Width * bitmap.Height * 4;
                byte[] rgbvalues = new byte[bytes];

                //将被锁定的位图数据复制到该数组内
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbvalues, 0, bytes);

                //对每一个像素的颜色进行灰度化
                double colortemp = 0;
                for (int i = 0; i < rgbvalues.Length; i += 4)
                {
                    colortemp = rgbvalues[i + 2] * 0.299 + rgbvalues[i + 1] * 0.587 + rgbvalues[i] * 0.114;
                    rgbvalues[i] = rgbvalues[i + 1] = rgbvalues[i + 2] = (byte)colortemp;
                }

                //把处理后的图像数组复制回图像
                System.Runtime.InteropServices.Marshal.Copy(rgbvalues, 0, ptr, bytes);

                //解锁位图像素
                bitmap.UnlockBits(bmpdata);
            }

            bitmap.Save("test.png");
        }
你根本就不懂WPF,我自己百度了一下一句话搞定你这么多行后台代码
 <ef:ColorToneEffect x:Key="GrayEffect" LightColor="Transparent" DarkColor="Black" Desaturation="0" ToneAmount="1"/>
你的代码适合用在winform里。而WPF 可以通过前台的标记语言达到不用后台代码实现视觉效果。在通过绑定耦合前后台。
zmidl 2018-03-01
  • 打赏
  • 举报
回复
引用 2 楼 zlxd19 的回复:
楼上正解
正解个鬼 ,直接用Blend的ColorToneEffect把图片刷成黑白的就行,WPF分前台后台,标记语言xaml就是要通过不写后台代码实现美工效果ok??
zlxd19 2018-02-08
  • 打赏
  • 举报
回复
楼上正解
zhuowp 2018-02-06
  • 打赏
  • 举报
回复
这个跟wpf没什么关系。 直接采用内存法,读入图片数据的时候读取图片的argb数据而不是单纯的rgb数据
        private void GrayImage(string fileName)
        {
            Bitmap bitmap = (Bitmap)Bitmap.FromFile(fileName, false);
            if (bitmap != null)
            {
                //位图矩形
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height);
                //以可读写的方式将图像数据锁定
                System.Drawing.Imaging.BitmapData bmpdata = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                //得到图形在内存中的首地址
                IntPtr ptr = bmpdata.Scan0;

                //构造一个位图数组进行数据存储
                int bytes = bitmap.Width * bitmap.Height * 4;
                byte[] rgbvalues = new byte[bytes];

                //将被锁定的位图数据复制到该数组内
                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbvalues, 0, bytes);

                //对每一个像素的颜色进行灰度化
                double colortemp = 0;
                for (int i = 0; i < rgbvalues.Length; i += 4)
                {
                    colortemp = rgbvalues[i + 2] * 0.299 + rgbvalues[i + 1] * 0.587 + rgbvalues[i] * 0.114;
                    rgbvalues[i] = rgbvalues[i + 1] = rgbvalues[i + 2] = (byte)colortemp;
                }

                //把处理后的图像数组复制回图像
                System.Runtime.InteropServices.Marshal.Copy(rgbvalues, 0, ptr, bytes);

                //解锁位图像素
                bitmap.UnlockBits(bmpdata);
            }

            bitmap.Save("test.png");
        }

8,731

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧