【发布时间】:2019-05-14 12:25:29
【问题描述】:
我在 C# 中有以下代码,可将给定的字节数组(FF 3C FF ...等)转换为位图。
你能帮我得到这段代码的VB6版本吗?
这里的方法我已经试过了:
base64 string to byte to image
http://vb.mvps.org/samples/NetCam/
https://www.planet-source-code.com/vb/scripts/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;
}
更新: 这是我的 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: 字节数组:
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF EF BF FF FF FF FF FF FF FF FF FF FF FF FF FF FF E7 3F FF FF FF FF FF FF FF FF FF FF FF FF FF FF E2 31 C7 12 53 1F FF FF FF FF FF FF FF FF FF E0 24 F2 72 42 4F FF FF FF FF FF FF FF FF FF FF E5 20 C2 12 4E 0F FF FF FF FF FF FF FF FF FF FF E7 27 93 92 4E 7F FF FF FF FF FF FF FF FF FF E7 30 C2 38 4F 0F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F9 3F FF FF FF FF FF FF FF FF FF FF FF FF FF F9 3F FF FF FF FF FF FF 80 00 7F FE 07 FF FC 3E 18 3F FF FF FF FF FF FF 80 00 7F F8 01 FF FC 3E 49 3F FF FF FF FF FF 80 00 7F F0 00 FF F8 3E 49 3F FF FF FF FF FF FF 80 00 7F E0 00 7F F8 3E 19 3F FF FF FF FF FF FF 80 00 7F E0 00 7F E0 3E 79 3F FF FF FF FF FF FF F0 7F C0 F0 3F 00 3E 7F FF FF FF FF FF FF FF FF E0 FF C1 F8 3F 00 3F FF FF FF FF FF FF FF FF E0 FF C1 F8 3F 00 3F FF FF FF FF FF FF FF FF C1 FF C1 F8 3F 08 3F FF FF FF FF FF FF FF FF FF C1 FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FF 83 FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF 83 FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FF 07 FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FF 07 FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FE 0F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FE 0F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FC 1F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF FC 1F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF F8 3F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF FF F8 3F FF C1 F8 3F F8 3F FF FF FF FF FF FF FF F0 3F FF C1 F8 3F F8 3F FF 00 00 01 FF FF FF FF F0 7F FF C1 F8 3F F8 3F FF 06 7C C1 FF FF FF FF F0 7F FF C1 F8 3F F8 3F FF 09 11 21 FF FF FF E0 7F FF C0 F0 3F F8 3F FF 09 11 01 FF FF FF FF E0 FF F1 E0 00 7F F8 3F FF 0F 11 01 FF FF FF FF E0 FF E0 E0 00 7F F8 3F FF 09 11 01 FF FF FF FF C0 FF E0 F0 00 F F F8 3F FF 09 11 21 FF FF FF FF C1 FF E0 F8 01 FF F8 3F FF 09 10 C1 FF FF FF C1 FF F1 FE 07 FF F8 3F FF 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF C0 E0 07 F8 1F 73 FF FF FF FF FF FF FF FF FF 80 60 07 F0 0E AD FF FF FF FF FF FF FF FF FF FF 00 20 07 E0 07 6F FF FF FF FF FF FF FF FF FF 0C 23 FF E1 87 EF FF FF FF FF FF FF FF FF FF FF 1E 22 1F E3 C7 EF FF FF FF FF FF FF FF FF FF FF FE 20 0F E3 C7 ED FF FF FF FF FF FF FF FF FF FF FC 20 07 E3 C7 F3 FF FF FF FF FF FF FF FF FF F8 21 87 E3 C7 FF FF FF FF FF FF FF FF FF FF FF F0 63 C7 E3 C7 FF FF FF FF FF FF FF FF FF FF E0 FF C7 E3 C7 FF FF FF FF FF FF FF FF FF FF FF C1 FF C7 E3 C7 FF FF FF FF FF FF FF FF FF FF FF 83 E7 C7 E3 C7 FF FF FF FF FF FF FF FF FF FF FF 07 E3 86 61 87 FF FF FF FF FF FF FF FF FF FF FF 00 20 04 20 07 FF FF FF FF FF FF FF FF FF FF FF 00 30 0C 30 0F FF FF FF FF FF FF FF FF FF FF FF 00 38 1E 78 1F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
【问题讨论】:
-
你说你做不到,但没有表现出你的努力。恐怕我们不是代码编写服务,但当您遇到特定问题时,我们会很乐意提供帮助。
-
正如我所写,我的努力是从这 3 个位置获取代码,并将其放入我的应用程序中,但没有奏效。我有那个可以工作的 C# 版本,但我需要一个 VB6 版本。我不知道是否需要在字节数组中添加一些额外的内容以使其成为位图(如位图标题),或者我做错了什么
-
DavidG 的意思是展示你的 VB6 代码。
-
顺便说一句,您可以从 VB6 中调用 C# 代码,这样可能更容易实现。
-
我认为不需要这样做。我确信这个请求即使在 VB6 中也很常见