编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> Windows Phone -> WP8图片处理(反色,灰度,柔化) -> 正文阅读

[Windows Phone]WP8图片处理(反色,灰度,柔化)

今天在做图片处理的时候没找到有多少关于wp8的图片处理,wp8.1的话因为API和window的一样了,处理按window来简单好多,而且也到处都是,所以就找了些资料,自己加了两个处理效果
1.灰度处理:
也就是将彩色变黑白效果,他的原理是:对每个像素点的RGB进行平均处理。下面我是使用了加权平均去算的

/// <summary>
        /// 灰度处理
        /// </summary>
        private void GrayScale()
        {
            WriteableBitmap wb = new WriteableBitmap(imageSource, null); //imageSource这个是image图片
            WriteableBitmap wb_gray = new WriteableBitmap(wb.PixelWidth, wb.PixelHeight);

            int[] ImageData = wb.Pixels;

            for (int i = 0; i < wb.PixelHeight; i++)
            {
                for (int j = 0; j < wb.PixelWidth; j++)
                {
                    int curColor = ImageData[i * wb.PixelWidth + j];

                    byte RedValue = (byte)(curColor >> 16 & 0xFF); //获取整形值
                    byte GreenValue = (byte)(curColor >> 8 & 0xFF);
                    byte BlueValue = (byte)(curColor & 0xFF);

                    byte GrayValue = (byte)(RedValue * 0.7 + GreenValue * 0.2 + BlueValue * 0.1);
                    
                    byte[] GrayValueArr = new byte[4];
                    GrayValueArr[3] = 0xFF;  //0x00
                    GrayValueArr[2] = GrayValue;
                    GrayValueArr[1] = GrayValue;
                    GrayValueArr[0] = GrayValue;

                    //依次通过该数组,获取作为整数值的单个像素值,这些整数值计算为自左乘的 ARGB32。
                    int GrayPixel = BitConverter.ToInt32(GrayValueArr, 0);
                
                    unchecked
                    {
                        wb_gray.Pixels[i * wb.PixelWidth + j] = GrayPixel;   //OK->成功啦!!!
                    }
                   
                }
            }
            wb_gray.Invalidate();

            imageC.Source = wb_gray; //imageC这个是image图片
        }

2.反色处理
原理:对每个像素点的RGB进行取反处理(就是用255去减)。

        private void inverse()
        {
            WriteableBitmap wb = new WriteableBitmap(imageSource, null);
            WriteableBitmap wb_gray = new WriteableBitmap(wb.PixelWidth, wb.PixelHeight);

            int[] ImageData = wb.Pixels;
           
            for (int i = 0; i < wb.PixelHeight; i++)
            {
                for (int j = 0; j < wb.PixelWidth; j++)
                {
                    int curColor = ImageData[i * wb.PixelWidth + j];
                    
                    int RedValue = curColor >> 16 & 0xFF;  
                    int GreenValue = curColor >> 8 & 0xFF;
                    int BlueValue = curColor & 0xFF;

                    byte[] GrayValueArr = new byte[4];
                    GrayValueArr[3] = 0xFF;  //0x00
                    GrayValueArr[2] = (byte)(255-RedValue);
                    GrayValueArr[1] = (byte)(255-GreenValue);
                    GrayValueArr[0] = (byte)( 255- BlueValue);

                    //依次通过该数组,获取作为整数值的单个像素值,这些整数值计算为自左乘的 ARGB32。
                    int GrayPixel = BitConverter.ToInt32(GrayValueArr, 0);

                    unchecked
                    {
                        wb_gray.Pixels[i * wb.PixelWidth + j] = GrayPixel;   
                    }

                }
            }

            wb_gray.Invalidate();

            imageC.Source = wb_gray;
        }

3.柔化处理
原理:当前像素点与周围像素点的颜色差距较大时取其平均值(这个也是看来的,个人感觉是取当前像素点颜色与周围的几个像素点颜色进行平均)

        private void Soften()
        {
            WriteableBitmap wb = new WriteableBitmap(imageSource, null);
            WriteableBitmap wb_gray = new WriteableBitmap(wb.PixelWidth, wb.PixelHeight);

            int[] ImageData = wb.Pixels;
            //高斯模板,高斯一个很牛逼的人,大学数学书里到处都有他,人称“数学王子”,没错高斯定理就是这家伙的
            int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
            for (int i = 0; i < wb.PixelHeight; i++)
            {
                for (int j = 0; j < wb.PixelWidth; j++)
                {
                    int curColor = ImageData[i * wb.PixelWidth + j];

                    int r = 0;
                    int g = 0;
                    int b = 0;

                    int Index = 0;
                    for (int col = -1; col <= 1; col++)
                        for (int row = -1; row <= 1; row++)
                        {
                            int x = (i + col) < 0 || (i + col) > i ? i : i + col;
                            int y = (j + row) < 0 || (j + row) > j ? j : j + row;

                            curColor = ImageData[x * wb.PixelWidth + y];
                            r += (curColor >> 16 & 0xFF) *Gauss[Index];
                            g += (curColor >> 8 & 0xFF) * Gauss[Index];
                            b += (curColor & 0xFF) * Gauss[Index];
                            Index++;
                        }

                    byte[] GrayValueArr = new byte[4];
                    GrayValueArr[3] = 0xFF;  //0x00
                    GrayValueArr[2] = (byte)(r/16);
                    GrayValueArr[1] = (byte)(g/16);
                    GrayValueArr[0] = (byte)(b/16);

                    //依次通过该数组,获取作为整数值的单个像素值,这些整数值计算为自左乘的 ARGB32。
                    int GrayPixel = BitConverter.ToInt32(GrayValueArr, 0);

                    unchecked
                    {
                        wb_gray.Pixels[i * wb.PixelWidth + j] = GrayPixel;  
                    }
                }
            }

            wb_gray.Invalidate();

            imageC.Source = wb_gray;
        }

原本还想做其他效果的,比如锐化效果,雾化效果,这里先说说原理(都是看来的呀),
锐化效果:突出显示颜色值大(即形成形体边缘)的像素点(就是把像素点的RGB值都加大)
雾化效果:在图像中引入一定的随机值, 打乱图像中的像素值(随机改变每个像素点的大小)
上面说的锐化效果还比较好实现方法都差不多,但是雾化效果可以看看ImageTools,里面提供了ImageTools.Filtering(还没看怎么用,主要看点EditableImage这个应该可以实现),其他的什么变绿变蓝的效果把RGB值中对应的颜色改改就出来了
  Windows Phone 最新文章
[UWP] 自定义一个ItemsPanel
WP8.1程序开发中,如何加载本地文件资源或安
UWP 律师信息 MVVM 2.0版本
Win10 FaceAPI小demo开发问题汇总
【转】UWP 捕获全局异常
x:bind不支持样式文件 或 此Xaml文件必须又
WP模拟器修改语言为中文方法
wp仿系统截图
Windows Phone 8 锁屏背景与通知
博客园新闻WP8.1客户端
上一篇文章      下一篇文章      查看所有文章
加:2015-03-30 14:46:38  更:2017-05-17 02:41:52 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年12日历
2019-12-9 21:25:11
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识