RT,影像格式是8位灰度圖片,現在知道它的首地址,高度,寬度。怎么獲取它的灰度影像
uj5u.com熱心網友回復:
算出byte[]大小就行,8位灰度表示1點1位元組byte[] buffer=new byte[寬*高]
Marshal.Copy(首地址,buffer,0,buffer.length ); //我們不知道,這個首地址指的是什么,我假定這是非托管地址,所以使用 Marshal.Copy
uj5u.com熱心網友回復:
byte[] arr = 你的資料.Skip(首地址).ToArray();Image img = Image.FromStream(new MemoryStream(arr));
uj5u.com熱心網友回復:
能說得具體一點嗎?uj5u.com熱心網友回復:
具體不了了,我們不知道你具體使用環境。只能假定這是呼叫C++dll的結果。 這樣可能對方回傳給你了寬,高和一個地址
比如回傳 inptr p,int 寬,int 高 。
8位灰度影像,就是一個位元組(8bit)代表一個像素點,所以 寬*高 可以得有多少個像素,即有多少個位元組。
Marshal.Copy 含義就是從記憶體中讀取多少位元組的資料給指定托管陣列
有關這東西的解釋看msdn把
https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshal.copy?redirectedfrom=MSDN&view=netframework-4.8#overloads
uj5u.com熱心網友回復:
能說得具體一點嗎?
算出byte[]大小就行,8位灰度表示1點1位元組
byte[] buffer=new byte[寬*高]
Marshal.Copy(首地址,buffer,0,buffer.length ); //我們不知道,這個首地址指的是什么,我假定這是非托管地址,所以使用 Marshal.Copy
具體不了了,我們不知道你具體使用環境。只能假定這是呼叫C++dll的結果。 這樣可能對方回傳給你了寬,高和一個地址
比如回傳 inptr p,int 寬,int 高 。
8位灰度影像,就是一個位元組(8bit)代表一個像素點,所以 寬*高 可以得有多少個像素,即有多少個位元組。
Marshal.Copy 含義就是從記憶體中讀取多少位元組的資料給指定托管陣列
有關這東西的解釋看msdn把
https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshal.copy?redirectedfrom=MSDN&view=netframework-4.8#overloads
原來這張圖片是通過其他控制元件顯示的,現在我能獲取到這張圖片的首地址Scan0,寬度和高度還有格式(Format8bppIndexed)。現在想保存成8位深度的BMP格式的圖片。
uj5u.com熱心網友回復:
byte[,] Data;//保存像素矩陣
int width_ = 0;
int heigth_ = 0;
int chnum_ = 0;
long buff_ = 0;
int tool = axCKVisionCtrl1.GetTool("采集影像");
buff_ = axCKVisionCtrl1.GetImageBuffer(tool, ref width_, ref heigth_, ref chnum_);
Bitmap bmp = new Bitmap(width_,heigth_);
// Lock the bitmap's bits.
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
this.Width = bmpData.Width;
this.Height = bmpData.Height;
Data = new byte[Height, Width];
unsafe
{
byte* ptr = (byte*)buff_;
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
//將24位的RGB彩色圖轉換為灰度圖
int temp = (int)(0.114 * (*ptr++)) + (int)(0.587 * (*ptr++))+(int)(0.299 * (*ptr++));
Data[i, j] = (byte)temp;
}
ptr += bmpData.Stride - Width * 3;//指標加上填充的空白空間
}
}
bmp.UnlockBits(bmpData);
pictureBox1.Image = bmp;
我的代碼如上所示,width_為獲取到的寬度,height_為獲取到的高度,buff_為獲取到的影像首地址,現在運行到“ int temp = (int)(0.114 * (*ptr++)) + (int)(0.587 * (*ptr++))+(int)(0.299 * (*ptr++));”這句話就報錯,提示““System.AccessViolationException”型別的未經處理的例外在 WindowsFormsApplication1.exe 中發生
其他資訊: 嘗試讀取或寫入受保護的記憶體。這通常指示其他記憶體已損壞。”
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/141467.html
標籤:C#
上一篇:關于C# INI檔案,附圖
下一篇:急求
