PDA

View Full Version : حرفه ای: نمایش تصویر با داشتن بایت هایش



just4froum
دوشنبه 16 مرداد 1391, 23:42 عصر
با سلام به همگی :

می خواستم بدونم آیا راهی وجود داره که بشه یک تصویر رو فقط با داشتن بایت هایش در یک Picture box نشون داد بدون این که اون بایت هارو در قالب یک فایل در کامپیوتر ذخیره کنیم و بعد در Picturebox لود کنیم ؟

با تشکر :قلب::قلب::قلب:

the king
سه شنبه 17 مرداد 1391, 01:16 صبح
با سلام به همگی :

می خواستم بدونم آیا راهی وجود داره که بشه یک تصویر رو فقط با داشتن بایت هایش در یک Picture box نشون داد بدون این که اون بایت هارو در قالب یک فایل در کامپیوتر ذخیره کنیم و بعد در Picturebox لود کنیم ؟

با تشکر :قلب::قلب::قلب:

بله میشه، اما شیوه های مختلف داره، به این دلیل که مشخص نکرده اید که منظورتون از بایت هایش محتویات کامل فایله (مثلا هر چی بایت داخل یک فایل JPEG هست)
یا فقط بایت های رنگ داخل تصویر. اگر همه بایت های اون فایل رو در اختیار دارید :

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As Long, ppstm As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As Long, riid As Any, ppvObj As Any) As Long

Private Function ArrayToStdPicture(ByRef InArray() As Byte, ByVal Offset As Long, ByVal Size As Long) As IPicture
Dim hMem As Long
Dim lpMem As Long
Dim GUID(0 To 3) As Long
Dim IIStream As IUnknown
GUID(0) = &H7BF80980
GUID(1) = &H101ABF32
GUID(2) = &HAA00BB8B
GUID(3) = &HAB0C3000
hMem = GlobalAlloc(GMEM_MOVEABLE, Size)
If hMem <> 0 Then
lpMem = GlobalLock(hMem)
If lpMem <> 0 Then
CopyMemory ByVal lpMem, InArray(Offset), Size
Call GlobalUnlock(hMem)
If CreateStreamOnHGlobal(hMem, 1, IIStream) = 0 Then
Call OleLoadPicture(ByVal ObjPtr(IIStream), 0, 0, GUID(0), ArrayToStdPicture)
Exit Function
End If
End If
GlobalFree hMem
Set ArrayToStdPicture = Nothing
End If
End Function


مثلا :

Private Sub Form_Load()
Dim bytes() As Byte
Dim pic As StdPicture
Open "C:\Windows\wallpaper.jpg" For Binary As #1
ReDim bytes(0 To LOF(1) - 1)
Get #1, 1, bytes
Close #1

Set pic = ArrayToStdPicture(bytes, 0, UBound(bytes) + 1)
Set Me.Picture = pic
End Sub

just4froum
سه شنبه 17 مرداد 1391, 07:02 صبح
با تشکر فراوان از شما.

بله دقیقا منظورم همین بود :لبخندساده:.