[C#编程参考]把图像转换为数组的两种实现

当一个程序和一个图片放在一起,无非有两种操作:

第一种,就是传输这个图片,在传输图片之前要首先把这个图片变成byte类型的数组。所以这时候我们用到的是图片的存储的数据,也就是图片属性中的大小。我们并不关心这个图片的像素矩阵信息。因为图片在存储的时候都是经过各种压缩的,所以我只需要把这个压缩的数据读取到内存,通过网络或者其他方式把它传送给接收方,然后接收方在把byte转换成图片,存储在硬盘上。在整个的过程中,我们不关心任何有关图片内部矩阵的信息,整个过程都保持图片的压缩的样式。

在传输的具体实现就是把图像Save到相应的Stream流,如文件流或者网络流。

详细链接:

[C#参考]byte数组和Image的相互转换

第二种,就是我们要操作图像的像素矩阵,这时候我们读入内存的图像就不能使压缩的图像了,要把压缩在硬盘上的图像恢复成原来的像素矩阵的形式,加载到内存中,然后转换成byte数组,对其做相应的处理。

实现的方法就是利用Bitmap实例对象的LockBits方法在自己的像素矩阵中锁定一个矩形区域,然后把锁定区域的像素加载到内存的BitmapData对象中。这时的BitmapData就只是锁定区域的像素信息,没有其他的说明信息或者压缩的信息。然后再对这个BitmapData对象操作,比如转换成byte数组,然后修改byte数组中的值,达到修改像素的作用。

同一个BitmapData对象可能被多个Bitmap对象持有,那么一旦BitmapData改变,所有的Bitmap对象都将受到影响,为了避免这种情况,可以用BitmapData对象提供的clone()方法生成当前BitmapData对象的拷贝。这种BitmapData和Bitmap的形式,在C++ OpenCV中很容易产生访问的限制,容易对同一个BitmapData释放两次。

详细链接:

[C#参考]BitmapData类
上一篇:css控制图片自适应大小


下一篇:小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景