Member 13373000 Ответов: 1

На C# : байтовый массив Диб в растровое изображение


Я работаю с COM-интерфейсом программного обеспечения, в частности OMICRON MPD 600. Я хотел бы сделать снимок экрана с помощью предоставленных методов, однако он возвращает изображение в виде DIB, заполненного внутри байтового массива.

Как можно использовать этот байтовый массив для сохранения этого снимка экрана в виде изображения? Я бы предпочел DIB растровому преобразованию, но на самом деле все, что позволило бы мне сохранить его как изображение, приемлемо.

У меня есть код VBA, который выполнил эту задачу с помощью:

Step 1: CopyMemory 
Step 2: GetDC
Step 3: CreateCompatibleDC
Step 4: CreateCompatibleBitmap
Step 5: SelectObject
Step 6: SetDIBits
Step 7: OleCreatePictureIndirect


Однако, когда я попытался сделать это с помощью C#, я застрял на первом шаге, где я извлекаю BitmapInfoHeader из массива байтов. Я могу извлечь значения he, но эти значения кажутся неправильными.

Что я уже пробовал:

int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(BITMAPINFOHEADER));
Debug.Print("Size of BitMapInfoHeader: " + size + "");
GCHandle pinned = GCHandle.Alloc(l, GCHandleType.Pinned);
IntPtr lPtr = pinned.AddrOfPinnedObject();
Debug.Print("Byte Array Lenght: " + l.Length + "");          
BITMAPINFOHEADER bim = (BITMAPINFOHEADER)Marshal.PtrToStructure(lPtr, typeof(BITMAPINFOHEADER));


Выше C# код дает мне:

Byte Array Lenght: 897860
biWidth after: -256
biHeight after: 511
biSize after: 256
biSizeImage after: 3005743104
biBitCount after: 0


В то время как рабочий код VBA производит:

Byte Array Length: 897832
biBitCount: 32
biClrImportant: 0
biClrUsed: 0
biCompression: 0
biHeight: 448
biPlanes: 1
biSize: 40
biSizeImage: 0
biWidth: 501
biXPelsPerMeter: 3110

1 Ответов

Рейтинг:
2

Graeme_Grant

Прямо здесь есть статья о проекте Code Project, которая ответит на этот вопрос за вас: Диб в систему.Растровый[^]