Mikle писал(а):А он прочитан как целый файл (с заголовком, кодированием и т. п.), или как готовые данные ARGB?
Изначально была задача - ну хоть как-нибудь

Хотя, конечно, лучше первое
Давно замечал такую штуку - пока сам пытаюсь ковыряться, решение вопроса обычно продвигается медленно и какими-то извилинами. А как сформулируешь да выложишь на форум - очень часто вопрос быстро решается словно сам собой.
В общем, я нашел вот этот пример:
viewtopic.php?f=28&t=31865Там есть загрузка из байтов, но в iPicture, что меня отпугнуло, когда натыкался на него раньше. А оказалось, что очень просто можно вживить загрузку из байтов оттуда в твою LoadFromFile. Практически весь код твой, только две строки поменялись.
- Код: Выделить всё
Public Sub LoadFromBytes(Bytes() As Byte, Optional ByVal Trans As SR2D_Transform = TrNone, Optional ByVal W As Long = 0, Optional ByVal H As Long = 0, Optional ByVal cKey As Long = -1)
Dim Res As Long
Dim Stream As IUnknown
Dim tSI As GdiplusStartupInput
Dim GDIP As Long
Dim Bmp As Long
Dim lData As BitmapData
Dim R As RECTL
Dim x As Long, y As Long
Dim Sp As SR2D_Sprite
If Trans <> TrNone Or W > 0 Or H > 0 Then
Set Sp = New SR2D_Sprite
Sp.LoadFromBytes Bytes
LoadFromSprite Sp, Trans, W, H, cKey
Else
tSI.GdiplusVersion = 1
Res = GdiplusStartup(GDIP, tSI)
If Res = 0 Then
CreateStreamOnHGlobal Bytes(0), False, Stream
Res = GdipLoadImageFromStream(Stream, Bmp)
If Res = 0 Then
GdipGetImageWidth Bmp, x
GdipGetImageHeight Bmp, y
R.Left = 0
R.Right = x
R.Top = 0
R.Bottom = y
Res = GdipBitmapLockBits(Bmp, R, ImageLockModeRead, PixelFormat32bppARGB, lData)
If Res = 0 Then
Init x, y, OpPaint
CopyMemory ByVal lData.Scan0, cBuf(0), x * y * 4
GdipBitmapUnlockBits Bmp, lData
If cKey >= 0 Then AddColorKey cKey: Op = OpAlphaTest
End If
GdipDisposeImage Bmp
End If
Set Stream = Nothing
GdiplusShutdown GDIP
End If
End If
End Sub
В общем, работает

Осталось понять, всё ли правильно - в частности, не нужно ли как-то по-особому уничтожать или освобождать стрим?