當(dāng)前位置:
首頁(yè) >
avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
發(fā)布時(shí)間:2023/12/1
64
豆豆
生活随笔
收集整理的這篇文章主要介紹了
avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
背景
最近在研究C#進(jìn)行圖像處理,在圖像處理中算法中,往往都是針對(duì)的是矩陣運(yùn)算的。矩陣其實(shí)就是一個(gè)二維的數(shù)組。
為了圖像處理的速度,我們都需要放在內(nèi)存中處理。但網(wǎng)絡(luò)上收集的代碼,往往都是以一維數(shù)組的樣子提供結(jié)果,這樣不利于后期圖像的算法實(shí)現(xiàn)。
初期通過(guò)自己摸索,均不能很好地將一幅圖轉(zhuǎn)換成二維數(shù)組,于是又在網(wǎng)絡(luò)上一頓海撈。
終于不負(fù)血汗!
也得益于熱心人士的信息提供,才有今天的煩惱解除,所以我也將我實(shí)現(xiàn)的代碼共享給需要朋友們。
提要
之前我一直未能成功進(jìn)行二維數(shù)組轉(zhuǎn)換的根本原因在于未能了解到BitmapData.Stride屬性的存在。
BitmapData.Stride屬性官方的解釋是這樣的。
Bitmap對(duì)象的跨距寬度,以字節(jié)為單位跨距是一行的像素 (掃描行),向上舍入為 4 字節(jié)邊界的寬度。如果正跨距,位圖是自上而下的。如果為負(fù)跨距,位圖是自下而上的BitmapData.Stride Property (System.Drawing.Imaging)?docs.microsoft.com
咋一看解釋,不大好理解。其實(shí)它要說(shuō)的內(nèi)容概括如下。
- BitmapData.Stride>=圖像寬度x3
- BitmapData.Stride<=(圖像寬度+1)x3
- 內(nèi)存數(shù)據(jù)是以Stride參照換行的,而并非連貫的BGR
而且,Stride還有正負(fù)(代表位圖的掃描方向),通常為正。
所以,以慣常BRG連續(xù)掃圖像內(nèi)存,通常得不到我們想要的結(jié)果
代碼
usingunsafe 版本 圖片轉(zhuǎn) 二維數(shù)組(網(wǎng)絡(luò)上收集)
//private unsafe byte[,] imageToByte(Bitmap bit_Image)//指針?lè)椒?/{// 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();//創(chuàng)建 byte* 指針格式,獲取圖像首地址 // byte[,] data = new byte[cols, rows]; //圖像列:cols 圖像行rows// //指針是一位一位移動(dòng)的,因此圖像轉(zhuǎn)byte時(shí),從第一行第一個(gè)位置開始向右移動(dòng),每次移動(dòng)三個(gè)位// for (int y = 0; y < rows; y++)// {// for (int x = 0; x < cols; x++) // x是和cols對(duì)應(yīng),獲取一個(gè)rgb,x移動(dòng)三個(gè)位// {// data[x, y] = (byte)(temp[0]);// temp += 3; //指針每次移動(dòng)三個(gè)位// }// temp += stride - 3 * cols; //注意要跳過(guò)空白的數(shù)據(jù)段// }// bit_Image.UnlockBits(da);// return data;//}-----------------------------------------------------------------------------
VB6.0 Picturebox 圖像與二維數(shù)組互轉(zhuǎn)
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總結(jié)
以上是生活随笔為你收集整理的avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “广岸屯宿阴”上一句是什么
- 下一篇: 字节流转化为文件流_C#文件转换为字节流