как загрузить картинку из массива?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Extremist
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 83
Зарегистрирован: 20.10.2004 (Ср) 1:50

как загрузить картинку из массива?

Сообщение Extremist » 20.10.2004 (Ср) 3:06

Dim myDataByte() As Byte
Dim iFreeFile As Integer
iFreeFile = FreeFile
redim mydatabyte(filelen("c:\123.jpg"))
Open "c:\123.jpg" For Binary As #iFreeFile
get #iFreeFile, , myDataByte ()
Close #iFreeFile
как мне загрузить картинку из myDataByte () (без сохранения на винт)
в picture :?:

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 20.10.2004 (Ср) 7:17

Вот так:
Код: Выделить всё
Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long
Declare Function IsEqualGUID Lib "ole32" (rguid1 As GUID, rguid2 As GUID) As Boolean

Public Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
Public Const S_OK = 0    ' indicates successful HRESULT
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Declare Function CreateStreamOnHGlobal Lib "ole32" _
                              (ByVal hGlobal As Long, _
                              ByVal fDeleteOnRelease As CBoolean, _
                              ppstm As Any) As Long

Public Const GMEM_MOVEABLE = &H2
Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long



Public Enum CBoolean   ' enum members are Long data types
  CFalse = 0
  CTrue = 1
End Enum

Private Type GUID    ' 16 bytes (128 bits)
  dwData1 As Long      ' 4 bytes
  wData2 As Integer     ' 2 bytes
  wData3 As Integer     ' 2 bytes
  abData4(7) As Byte   ' 8 bytes, zero based
End Type

Private Declare Function OleLoadPicture Lib "olepro32" _
                              (pStream As Any, _
                              ByVal lSize As Long, _
                              ByVal fRunmode As CBoolean, _
                              riid As GUID, _
                              ppvObj As Any) As Long

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
  On Error GoTo Out
  nLow = LBound(abPic)
  On Error GoTo 0
  cbMem = (UBound(abPic) - nLow) + 1
 
  ' Allocate a global memory object
  hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem)
  If hMem Then
   
    ' Lock the memory object and get a pointer to it.
    lpMem = GlobalLock(hMem)
    If lpMem Then
     
      ' Copy the picture bits to the memory pointer and unlock the handle.
      MoveMemory ByVal lpMem, abPic(nLow), cbMem
      Call GlobalUnlock(hMem)
     
      ' Create an ISteam from the pictures bits (we can explicitly free hMem
      ' below, but we'll have the call do it here...)
      If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then
        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..)
          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
     
Out:
End Function
الفيجوال بيسك الرابح

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2004 (Ср) 10:14

Во извращенцы...

LoadPicture не грузит только png. Остальное грузит...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.10.2004 (Ср) 12:31

LoadPicture -> из массива-то?

А моя супер-пупер обёртка для GDI+ позволяет грузить из массива что угодно, хоть ico, хоть png!!

http://mix.web.ur.ru/JPEG.zip
Изображение

Extremist
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 83
Зарегистрирован: 20.10.2004 (Ср) 1:50

Сообщение Extremist » 21.10.2004 (Чт) 11:14

Как применить PictureFromBits к моему Picture1 :shock:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.10.2004 (Чт) 14:22

Extremist, ты мою супер-обёртку посмотрел?
Там это делается в одну строку:
Код: Выделить всё
Set Picture1.Picture = CreateImageFromMemory(myDataByte()).Picture
Изображение

Extremist
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 83
Зарегистрирован: 20.10.2004 (Ср) 1:50

Сообщение Extremist » 21.10.2004 (Чт) 16:43

Огромное спасибо всем :D :!: :!: :!:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2004 (Чт) 16:45

... вот чё я не понимаю, так это зачем, имея картинку на диске в формате jpg, загружать её в байтовый массив, а потом привлекать GDI+, если можно сразу сделать loadpicture("c:\123.jpg")...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Extremist
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 83
Зарегистрирован: 20.10.2004 (Ср) 1:50

Сообщение Extremist » 23.10.2004 (Сб) 2:08

Это я просто привел пример, на самом деле я делаю файл ресурсов своего формата.
"Со мной каши не сваришь", - ошибочно полагал Джеймс Кук.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.05.2005 (Вт) 15:14

То, что написал GM, это круто, а есть ли способ перегнать обратно, Picture1.Image в байтовый массив не сохраняя его на диск?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.05.2005 (Вт) 18:32

Моей обёрткой - вызовом SaveToMemory ;-)
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.05.2005 (Ср) 8:57

А можно без нее? Всего одну процедурку? Плиииииииз...
Лучший способ понять что-то самому — объяснить это другому.

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 04.05.2005 (Ср) 13:27

Antonariy писал(а):А можно без нее? Всего одну процедурку? Плиииииииз...


А кофе из шланга?
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.05.2005 (Ср) 14:03

Спасибо, кофе не пью :P
А вот и решение, для его работы требуется stg.tlb

Код: Выделить всё
Public Sub Picture2Array(ByVal oObj As StdPicture, aBytes() As Byte)
Dim oIPS As IPersistStream
Dim oStream As IStream, hGlobal As Long, lPtr As Long
Dim lSize As Long, Hdr As PictureHeader
Dim lRes As Long
    Set oIPS = oObj
    CreateStreamOnHGlobal 0, True, oStream
    oIPS.Save oStream, True
    GetHGlobalFromStream oStream, hGlobal
    lSize = GlobalSize(hGlobal)
    lPtr = GlobalLock(hGlobal)
    lSize = lSize - Len(Hdr)
    ReDim aBytes(0 To lSize - 1)
    MoveMemory aBytes(0), ByVal lPtr + Len(Hdr), lSize
    GlobalUnlock hGlobal
    Set oStream = Nothing
End Sub


Развернем обертки! Проприетарный код в массы!! ДАЕШЬ!!!
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 170

    TopList