avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
背景
最近在研究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 图像与二维数组 互转相关推荐
- PHP常用数组函数(含按键值删除二维数组中的元素)
// 1.array_search():在数组中搜索键值"red",并返回它的键名 $a=array("a"=>"red"," ...
- 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标
*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...
- c语言字符二维数组传参,C语言函数传递二维数组
C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...
- pythonjson构建二维数组_python后台获取ajax传递的二维数组,保持原有数据结构不变...
python后台获取ajax传递的二维数组,保持原有数据结构不变. 前台主要程序: arr_data = [[1,2,3],[4,5,6]];//创建二维数组 var json_data = JSON ...
- c语言字符串二维数组初始化为0,c语言二维数组如何初始化为0
c语言二维数组如何初始化 1 有两种方法 (1)在定义时可以直接赋值来初始化 (2)在定义后可以为其元素一个个来赋值 2 示例 123456789101112131415161718192021222 ...
- C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策
一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...
- python二维数组去重_np.unique()对一维和二维数组去重
一维数组 对一维数组或列表,unique()函数去除其中重复元素,并按元素大小返回一个新的无重复元组或列表. import numpy as np A = [1, 2, 2, 5,3, 4, 3] a ...
- opencv图像和二维数组相互转换
Mat 转二维数组: int Laplace::TempltExcute(Mat &src,int*tmplt,int tw,intx,int y){ inti,j,py,px; intsum ...
最新文章
- 你和你的好友,正在免费帮微信训练神经网络
- 关于网站调用在线翻译api实现翻译功能
- flex项目,file not found错误解决
- 设计模式到底离我们有多远
- [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
- 【记忆化搜索】bzoj3208 花神的秒题计划Ⅰ
- 知名大学博士毕业都去哪儿?55所高校大数据揭秘
- springboot 添加 lombok 报错更新 版本号
- 对比Cnblogs.com、CSDN.net和Javaeye.com的人气
- 1Checker(易改英文校对软件)官方中文版V2.0.1.5 | 易改英语单词检查软件下载
- 银联统一规范的收单业务消息域
- 57-20210402华为海思Hi3516DV300的linux系统下NFS文件系统挂载(eMMC模式)
- niushop分销版开源商城旗舰版v3.7商城源码旗舰版PJ版
- 吉利汽车资深总工程师刘卫国:智能驾驶汽车核心技术之控制器
- 关于浏览器核心的一些思考
- GitLab介绍与使用
- 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
- 记录下对Clipper.js的使用
- 【C++】vector模拟实现
- 虚拟机与主机互ping
热门文章
- android webview rem,Android部分webview rem计算误差记录
- java wmi远程桌面服务器_WMI实现远程监控多台windows服务器
- 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )
- 逍遥模拟器配置burpsuite抓包环境
- oledb excel java_C#中Excel 2016的oledb连接字符串
- 怎么得到scrollTop
- 用观察者模式编写一个可被其他对象拓展复用自定义事件系统
- style对象的cssText方法
- 用CSS让DIV上下左右居中的方法
- js笔记(四)内置对象Math和Date()、浏览器对象模型BOM