Вы действительно не можете объявить указатели на управляемые ссылочные типы (а ваш класс _24bit является управляемым ссылочным типом).Даже если вы объявите _24bit
как struct
(сделав его типом значения), он все равно будет содержать ссылку на байтовый массив (не сам байтовый массив, а только ссылку, что делает размер этой структуры больше 24 бит),Вы можете объявить свой массив как fixed
и unsafe
, чтобы исправить это.Вам также может понадобиться указать атрибут StructLayout
:
[StructLayout(LayoutKind.Sequential, Pack=1, Size=3)]
struct _24bpp
{
public unsafe fixed byte _value[3];
}
Обратите внимание, что вы можете получить доступ к содержимому этой структуры только в контексте unsafe
.Или вообще удалите объявление массива:
[StructLayout(LayoutKind.Sequential, Pack=1, Size=3)]
struct _24bpp
{
public byte B;
public byte G;
public byte R;
}
В качестве альтернативы, вы можете воссоздать растровое изображение с точки зрения ваших структур данных и скопировать данные из неуправляемой памяти в ваши структуры данных.Что-то вроде
public static _24bit[][] GetBitmapPixelsFrom24bpp(BitmapData data)
{
if(data == null) throw new ArgumentNullException("data");
var bitmapRows = new _24bit[rows][];
for(int row = 0; row < data.Height; ++r)
{
bitmapRows[row] = new _24bit[data.Width];
for(int pixel = 0; pixel < data.Width; ++pixel)
{
byte b = Marshal.ReadByte(data.Scan0, data.Stride * row + pixel * 3 + 0);
byte g = Marshal.ReadByte(data.Scan0, data.Stride * row + pixel * 3 + 1);
byte r = Marshal.ReadByte(data.Scan0, data.Stride * row + pixel * 3 + 2);
var bitmapPixel = new _24bit();
bitmapPixel._value[0] = b;
bitmapPixel._value[1] = g;
bitmapPixel._value[2] = r;
bitmapRows[row][pixel] = bitmapPixel;
}
}
return bitmapRows;
}