У меня есть следующий код в C #, который преобразует данный массив байтов (FF 3C, FF ... и т. Д.) В растровое изображение.
Можете ли вы помочь мне получить версию этого кода для VB6?
Я уже попробовал методы здесь:
строка base64 в байтах для изображения
http://vb.mvps.org/samples/NetCam/
https://www.planet -source-code.com / VB / скрипты / ShowCode.asp? TxtCodeId = 29004 & lngWId = 1
Но я не могу заставить это работать. Я пытаюсь загрузить изображение напрямую в поле для картинок или записать его в файл .bmp, но в результате изображение не получается ...
Спасибо
public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height)
{
Bitmap bmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format1bppIndexed);
// Prepare a locked image memory area
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, bmp.PixelFormat);
// Move our data in
System.Runtime.InteropServices.Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
bmp.UnlockBits(bmpData);
return bmp;
}
UPDATE:
Это мой код VB6:
Private Sub UpdatePictureBox
Dim buff(1023) as byte
' fill the byte array ...
Set PictureLCD.Picture = PictureFromBits(buff)
End Sub
Public Function PictureFromBits(abPic() As Byte) As IPicture ' not a StdPicture!!
Dim nLow As Long
Dim cbMem As Long
Dim hMem As Long
Dim lpMem As Long
Dim IID_IPicture As GUID
Dim istm As stdole.IUnknown ' IStream
Dim ipic As IPicture
' Get the size of the picture's bits
100 nLow = LBound(abPic)
110 cbMem = (UBound(abPic) - nLow) + 1
' Allocate a global memory object
120 hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem)
130 If hMem Then
' Lock the memory object and get a pointer to it.
140 lpMem = GlobalLock(hMem)
150 If lpMem Then
' Copy the picture bits to the memory pointer and unlock the handle.
160 MoveMemory ByVal lpMem, abPic(nLow), cbMem
170 Call GlobalUnlock(hMem)
' Create an ISteam from the pictures bits (we can explicitly free hMem
' below, but we'll have the call do it...)
180 If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then
190 If (CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture) = S_OK) Then
' Create an IPicture from the IStream (the docs say the call does not
' AddRef its last param, but it looks like the reference counts are correct..)
200 Call OleLoadPicture(ByVal ObjPtr(istm), cbMem, CFalse, _
IID_IPicture, PictureFromBits)
End If ' CLSIDFromString
End If ' CreateStreamOnHGlobal
End If ' lpMem
' Call GlobalFree(hMem)
End If ' hMem
End Function
Код взят здесь:
http://www.vbforums.com/showthread.php?287495-load-a-picture-box-control-from-memory
Я проверил, и байтовый массив заполнен правильно, но я не вижу изображения в графическом окне ...
ОБНОВЛЕНИЕ 2:
Массив байтов: