Как конвертировать изображение BMP в PictureBox в массив байтов в VB6 - PullRequest
1 голос
/ 07 марта 2019

В устаревшем приложении VB6 у меня есть изображение BMP, сохраненное в PictureBox. Я могу сохранить его в файл BMP, используя:

  SavePicture picBox.Picture, "BmpImage.bmp"

Однако я хочу сохранить изображение BMP в PictureBox в массив байтов. Мне нужно хранить весь BMP, включая заголовки BMP. По сути, мне нужны те же данные, которые были бы записаны в файл BMP, но в байтовом массиве без необходимости записи и чтения файла на диске.

Я искал, но не нашел в Интернете ничего, что решает этот конкретный вопрос.


Я нашел одну ссылку , в которой предлагалось записать в MemoryStream. Итак, я попробовал это:

10  Dim bmpArray() As Byte
20  Dim memStream As New System.IO.MemoryStream

50  SavePicture picBox.Picture, memStream
60  bmpArray = memStream.GetBuffer

Однако это не компилируется. Я получаю «Определенный пользователем тип не определен» для «System.IO.MemoryStream», который я включил в свой список ссылок System. Я также попытался объявить New MemoryStream , но все еще получаю ошибку компилятора «Тип пользователя не определен».


Также я рассмотрел аналогичный вопрос , однако предоставленное решение хранит только данные пикселей в массиве.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

В GDI32 есть функции, упрощающие получение массива из изображения.Я не могу опубликовать здесь рабочий код, потому что я написал большую его часть в сборке с использованием пользовательских типов и т. Д., Но я могу сказать вам, чтобы начать поиск с GetDIBits(), где «DI» означает «Независимый от устройства».

Вот декларация для этого:

Public Declare Sub GetDIBits Lib "gdi32" _
 (ByVal hDC As Long, _
  ByVal hBitmap As Long, _
  ByVal nStartScan As Long, _
  ByVal nNumScans As Long, _
  ByRef lpBits As Any, _
  ByRef lpBI As BITMAPINFO, _
  ByVal wUsage As Long)

Используйте .hDC графического блока.

Вам понадобятся определения для BITMAPINFO, BITMAPINFOHEADERи т.д., но звучит так, как будто у вас уже есть такие.

1 голос
/ 07 марта 2019

Если вам буквально нужно точное содержимое файла BMP в виде массива байтов, почему бы не сделать это пошагово?

Шаг 1. Используйте SavePicture для записи во временный файл.

Шаг 2: Используйте обычные операции ввода-вывода файла для чтения временного файла обратно в массив.

Шаг 3: Удалите временный файл

...