我想将位图图像转换为Int数组,以便我可以计算该数组中所有元素的总和,并进行其他数学计算。
使用Aforge.NET我已经提取了绿色通道并获得了图像的裁剪版本。裁剪图像的尺寸表示:1989 x 115 = 228735像素。使用Lockbits和Marshal.Copy将其转换为int数组后,数组的维数为229080;这比它应该的更多;下面是我的代码,请告诉我我正在做的错误。
// create filter
ExtractBiggestBlob BBB = new ExtractBiggestBlob();
// apply the filter
Bitmap biggestBlobsImage = BBB.Apply(ChannelImage); // works perfect; set all pictureBox to Zoom size
pictureBox1.Image = biggestBlobsImage; // pictureBox1 - GreenChannelCroppedImage
Console.WriteLine(biggestBlobsImage.Width);
Console.WriteLine(biggestBlobsImage.Height);
// Next step - Display rotation corrected image in pictureBox3
// Convert the Bitmap biggestBlobsImage to Int array;
Rectangle rect = new Rectangle(0, 0, biggestBlobsImage.Width, biggestBlobsImage.Height);
System.Drawing.Imaging.BitmapData bmpData =
biggestBlobsImage.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, biggestBlobsImage.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * biggestBlobsImage.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
// do something with the array
Console.WriteLine(rgbValues.Length);
Console.WriteLine(rgbValues.Rank);
// Copy the RGB values back to the bitmap
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
biggestBlobsImage.UnlockBits(bmpData);
答案 0 :(得分:1)
请注意,您正确地按高度复制“步幅”,而不是“高度宽度”。你必须使用Stride,因为当你的每个像素需要24个像素时,每个像素需要3个字节,那么在32位内存上,你可以在每行的末尾没有使用几个字节。 例如,如果你有1像素乘1像素的图像,而你只需要24位,但你需要32位,因为你必须采用整个单词(32位系统中32位,或64位内存系统上64位)