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

第一种,就是传输这个图片,在传输图片之前要首先把这个图片变成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类

[C#编程参考]把图像转换为数组的两种实现的更多相关文章

  1. python将两个数组合并成一个数组的两种方法的代码

    内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...

  2. js中将类数组转换为数组的几种方法

    1.slice方法 最经典的方法,使用Array的slice方法,此方法如果不传参数的话会返回原数组的一个拷贝,因此可以用此方法转换类数组到数组: // 创建一个类数组对象 var alo = {0: ...

  3. python数字转换为字符串的两种方式

    主要包括两种形式进行转换: 第一种是str(),将值转换为用户便于阅读的形式: 另一种是repr(),将值转换为合法的python表达式. >>> print repr(" ...

  4. C++函数传递数组的两种方式

    数组与指针. 传首地址过去,然后通过地址输出数组元素. 1.一维数组 #include<iostream> using namespace std; #include <cstrin ...

  5. Python -- 值转换为字符串的两种机制

    可以通过以下两个函数来使用这两种机制:一是通过str函数,它会把值转换为合理形式的字符串,以便用户可以理解:而repr会创建一个字符串,它以合法的Python表达式的形式来表示值.下面是一些例子: & ...

  6. C++&OpenCV中读取灰度图像到数组的两种

    如标题所言,此处是对于灰度图像而言 ///method 1 read the image data one by one for (int row = 0, i = 0;row < imgDst ...

  7. C51编程中对单片机绝对地址访问的两种方法

    在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间.C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定.为了能够在C ...

  8. nodejs 遍历数组的两种方法

    var array = [1,2,3]; array.forEach(function(v,i,a){ console.log(v); console.log(i); console.log(a); ...

  9. python遍历数组的两种方法

    第一种,最常用的,通过for in遍历数组 1 2 3 4 5 6 7 8 colours = ["red","green","blue"] ...

随机推荐

  1. VC使用双缓冲避免绘图闪烁的正确使用方法【转】

    使用内存DC绘图,然后实现双缓冲,避免绘图闪烁,这个小技术简单但很有效.但是仍然有很多人说使用了双缓冲,图片却仍然有闪烁,分析了几个这样的例子,发现 其实不是双缓冲的技术问题,而是使用者没有正确理解和 ...

  2. sass的cd进入目录

    今天在弄sass安装进入项目文件命令 直接f:

  3. 学习使用React Native的心得体会

    首先根据官网上的介绍,安装必须的环境需求.http://reactnative.cn/docs/0.20/getting-started.html#content 下面讲一下一些常用的命令: .下载n ...

  4. 达内TTS6.0课件oop_day05

  5. javascript中数组循环的方式

    forEach循环:        arr1.forEach(function(value,i)//value 值 i 下标            {console.log([value,i])}); ...

  6. SQL学习之HAVING过滤分组

    1.SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组.例如,你可能想要列出至少有两个订单的所有顾客.为此,必须基于完整的分组而不是个别的行进行过滤. 基 ...

  7. 微信支付 v 3.3.6

    文字说明: 前提:注册.申请服务号,开通微信支付. 涉及到的参数:AppId.AppSecret.原始ID(自动回复).mch_id(商户号).Key(商户密钥:自己设定.) 统一规范: 要求 认证方 ...

  8. 【转】CoreData以及MagicalRecord (一)

    先粗略的了解下CoreData中的一些核心概念 1. CoreData 的核心概念 先上两幅关键的概念图 (1)NSManagedObjectModel 托管对象模型(MOM)是描述应用程序的数据模型 ...

  9. NOPI导出Excel 自定义列名

    NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! /// 数据大于65 ...

  10. firebreath注册接口

    对firebreath文档进行翻译,顺便做个笔记,原地址:http://www.firebreath.org/display/documentation/JSAPIAuto 综述: 你可能会对需要转换 ...