背景

最近在研究C#进行图像处理,在图像处理中算法中,往往都是针对的是矩阵运算的。矩阵其实就是一个二维的数组。

为了图像处理的速度,我们都需要放在内存中处理。但网络上收集的代码,往往都是以一维数组的样子提供结果,这样不利于后期图像的算法实现。

初期通过自己摸索,均不能很好地将一幅图转换成二维数组,于是又在网络上一顿海捞。

终于不负血汗!

也得益于热心人士的信息提供,才有今天的烦恼解除,所以我也将我实现的代码共享给需要朋友们。

提要

之前我一直未能成功进行二维数组转换的根本原因在于未能了解到BitmapData.Stride属性的存在。

BitmapData.Stride属性官方的解释是这样的。

Bitmap对象的跨距宽度,以字节为单位
跨距是一行的像素 (扫描行),向上舍入为 4 字节边界的宽度。如果正跨距,位图是自上而下的。如果为负跨距,位图是自下而上的

BitmapData.Stride Property (System.Drawing.Imaging)​docs.microsoft.com

咋一看解释,不大好理解。其实它要说的内容概括如下。

  • BitmapData.Stride>=图像宽度x3
  • BitmapData.Stride<=(图像宽度+1)x3
  • 内存数据是以Stride参照换行的,而并非连贯的BGR

而且,Stride还有正负(代表位图的扫描方向),通常为正。

所以,以惯常BRG连续扫图像内存,通常得不到我们想要的结果

代码

using 

unsafe 版本 图片转 二维数组(网络上收集)

        //private unsafe byte[,] imageToByte(Bitmap bit_Image)//指针方法//{//    int cols = bit_Image.Width;//    int rows = bit_Image.Height;//    System.Drawing.Imaging.BitmapData da = new System.Drawing.Imaging.BitmapData();//    da = bit_Image.LockBits(new Rectangle(0, 0,//          bit_Image.Width, bit_Image.Height),//          System.Drawing.Imaging.ImageLockMode.ReadWrite,//          System.Drawing.Imaging.PixelFormat.Format24bppRgb);//图像格式24位RGB ;//    int stride = da.Stride;//    byte* temp = (byte*)da.Scan0.ToPointer();//创建 byte* 指针格式,获取图像首地址 //    byte[,] data = new byte[cols, rows];     //图像列:cols  图像行rows//    //指针是一位一位移动的,因此图像转byte时,从第一行第一个位置开始向右移动,每次移动三个位//    for (int y = 0; y < rows; y++)//    {//        for (int x = 0; x < cols; x++)   //  x是和cols对应,获取一个rgb,x移动三个位//        {//            data[x, y] = (byte)(temp[0]);//            temp += 3;                   //指针每次移动三个位//        }//        temp += stride - 3 * cols;       //注意要跳过空白的数据段//    }//    bit_Image.UnlockBits(da);//    return data;//}

-----------------------------------------------------------------------------

VB6.0 Picturebox 图像与二维数组互转

Private 

使用示例

Private Sub Command1_Click()Dim Val() As ByteReDim Val(0 To 255, 0 To 255) As ByteFor x = 0 To 255For y = 0 To 255Val(x, y) = xNextNextTrans_2D_To_Map Picture1, ValTrans_Map_To_2D Picture1, ValTrans_2D_To_Map Picture1, Val
End Sub

avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转相关推荐

  1. PHP常用数组函数(含按键值删除二维数组中的元素)

    // 1.array_search():在数组中搜索键值"red",并返回它的键名 $a=array("a"=>"red"," ...

  2. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  3. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

  4. c语言字符二维数组传参,C语言函数传递二维数组

    C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...

  5. pythonjson构建二维数组_python后台获取ajax传递的二维数组,保持原有数据结构不变...

    python后台获取ajax传递的二维数组,保持原有数据结构不变. 前台主要程序: arr_data = [[1,2,3],[4,5,6]];//创建二维数组 var json_data = JSON ...

  6. c语言字符串二维数组初始化为0,c语言二维数组如何初始化为0

    c语言二维数组如何初始化 1 有两种方法 (1)在定义时可以直接赋值来初始化 (2)在定义后可以为其元素一个个来赋值 2 示例 123456789101112131415161718192021222 ...

  7. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  8. python二维数组去重_np.unique()对一维和二维数组去重

    一维数组 对一维数组或列表,unique()函数去除其中重复元素,并按元素大小返回一个新的无重复元组或列表. import numpy as np A = [1, 2, 2, 5,3, 4, 3] a ...

  9. opencv图像和二维数组相互转换

    Mat 转二维数组: int Laplace::TempltExcute(Mat &src,int*tmplt,int tw,intx,int y){ inti,j,py,px; intsum ...

最新文章

  1. 你和你的好友,正在免费帮微信训练神经网络
  2. 关于网站调用在线翻译api实现翻译功能
  3. flex项目,file not found错误解决
  4. 设计模式到底离我们有多远
  5. [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
  6. 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
  7. 知名大学博士毕业都去哪儿?55所高校大数据揭秘
  8. springboot 添加 lombok 报错更新 版本号
  9. 对比Cnblogs.com、CSDN.net和Javaeye.com的人气
  10. 1Checker(易改英文校对软件)官方中文版V2.0.1.5 | 易改英语单词检查软件下载
  11. 银联统一规范的收单业务消息域
  12. 57-20210402华为海思Hi3516DV300的linux系统下NFS文件系统挂载(eMMC模式)
  13. niushop分销版开源商城旗舰版v3.7商城源码旗舰版PJ版
  14. 吉利汽车资深总工程师刘卫国:智能驾驶汽车核心技术之控制器
  15. 关于浏览器核心的一些思考
  16. GitLab介绍与使用
  17. 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
  18. 记录下对Clipper.js的使用
  19. 【C++】vector模拟实现
  20. 虚拟机与主机互ping

热门文章

  1. android webview rem,Android部分webview rem计算误差记录
  2. java wmi远程桌面服务器_WMI实现远程监控多台windows服务器
  3. 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )
  4. 逍遥模拟器配置burpsuite抓包环境
  5. oledb excel java_C#中Excel 2016的oledb连接字符串
  6. 怎么得到scrollTop
  7. 用观察者模式编写一个可被其他对象拓展复用自定义事件系统
  8. style对象的cssText方法
  9. 用CSS让DIV上下左右居中的方法
  10. js笔记(四)内置对象Math和Date()、浏览器对象模型BOM