在WPF中编辑图片的像素

【提示:为了方便大家阅读并寻求参考,文中的超链接均连接到MSDN中的相应内容。】

前些天开始研究WPF。是从图片的显示、编辑和保存开始研究的。

在我看来,WPF和以前的Form在图片处理方面的变化太大了。它们分别用了不同的类来表示图片。在From中用的是Image类;而在WPF中,Image已经作为显示图片用的控件了,表示图片的类是ImageSourceBitmapSourceBitmapImage、 WriteableBitmap等。现在还不是很清楚这些类的特点和具体应用方面。

不过前些天遇到的问题(http://student.csdn.net/space.php?uid=127131&do=thread&id=10182)也算是通过努力解决了。

现在就总结一下:

1、首先要了解图片的格式。

我所用的源图片都是jpg或bmp格式的。在这两种格式图片中一般都是用R、G、B三个元素表示一个像素。所以在程序中每个像素都是用3个byte型的变量表示的。

这里面还应该说一下。当对图片进行像素的读取操作时,图片的Width和height应该用PixelWidth和PixelHeight属性获取。因为在WPF中Width和height属性是double型的,它用来表示图像的显示尺寸,而不是实际尺寸。

2、读入并用Image控件显示图片。

在WPF中,感觉文件的路径好多都要转化成Uri类的对象才能很方便地使用。要读如图片当然利用OpenFileDialog先找到图片的路径fileName(当然是string型的)。然后新建一个Uri fileUri=new Uri(fileName);。之后,我利用BitmapDecoder类将图片解码,并将解码后的图片送到Image控件中显示。至于Create中的后两个参数我也不是很明白,只知道这样做没有错。

Code:
  1. Uri fileUri=new Uri(fileName);  
  2. BitmapDecoder decoder = BitmapDecoder.Create(fileUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);  
  3. image1.Source = decoder.Frames[0];  


3、其次要找到方法将图片的像素读出来,并将修改后的像素写回去。

在以上提到的WPF中表示图片的四个类中,BitmapSource、BitmapImage、 WriteableBitmap都具有CopyPixels方法。用这个方法就可以将图像中的像素读出来。其原型为public virtual void CopyPixels(Array pixels,int stride, int offset)【这里只介绍这一种重载方式】。

Array pixels:执行此函数后,这个变量里面的值就是所要取得的图片像素数据。在调用这个函数之前可以先声明一个byte型数组(如byte[] imgPixels = new byte[像素个数×每个像素所含元素个数]);

int stride:stride原意为跨越、步幅。经过我分析,感觉它在这里表示图片的一行所需要的byte数量。也就是【每行像素个数×每个像素元素个数】;

int offset:这个比较好理解,就是从哪里(用像素表示的位置)开始copy pixels。

4、对像素数据(imgPixels 数组)进行操作。

这里我就不说了,您随意!

5、用修改后的数据生成新的图像。

上面说获取像素时,BitmapSource、BitmapImage、 WriteableBitmap都可以,但是利用像素生成图片时,却只有WriteableBitmap才能胜任。因为只有它才具有WritePixels方法。其原型为public void WritePixels(Int32Rect sourceRect,Array pixels,int stride,int offset)【这里只介绍这一种重载方式】。

Int32Rect sourceRect:需要更新的区域,也就是需要用像素数据更改的区域。如果创建一张新图片的话,那这里就是new Int32Rect(0,0,PixelWidth,PixelHeight)了;

Array pixels和int stride就不多解释了,含义和用法同上;

int offset:还是有必要说一下的。在这里,它指的是像素数据的偏移量,也就是pixels数组的偏移量,而不是像素的偏移量。

这里面,WriteableBitmap类型的图片可以很方便转换成其他几种图片类型。

6、保存刚刚生成的图片。

由于我是对像素进行的操作,并向让再次打开图片是能够知道我对象度进行了哪些操作,所以我将图像保存成Bmp格式。这里面的重点是要用BitmapEncoder类将图像编码。当然不同图像格式有不同的类继承自BitmapEncoder类,向这里就用到了BitmapEncoder类的子类BmpBitmapEncoder。不多解释了,代码如下:

Code:
  1. static public void SaveImage(string file, BitmapSource img)  
  2.  {  
  3.       BmpBitmapEncoder encoder = new BmpBitmapEncoder();  
  4.       encoder.Frames.Add(BitmapFrame.Create(img));  
  5.   
  6.       FileStream bitmap = new FileStream(file, FileMode.Create, FileAccess.Write);  
  7.       encoder.Save(bitmap);  
  8.       bitmap.Close();  
  9.  }  

就这样,有兴趣的可以试一试。

另外我初学WPF,有什么说的不对的,还请大家帮助批评指导啊!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值