VBMySQL.com     The Web's Leading Resource For Visual Basic and MySQL
                                       Development
              Corner
              image  HOME | ARTICLES | SAMPLECODE | FORUMS | PRESENTATIONS |
              for                             BLOG
              bottom
              border

   Home Home   Members Members   Search Search   F.A.Q. F.A.Q.    Register
   Register    Login Login
   Article Related Forums >> Visual Basic/MySQL Articles >> Displaying
   image data immediately w/out saving to Disk

   Show: Today's Messages  :: Show
   Polls :: Message Navigator               Switch to threaded view of this
   Email to friend                    topic Create a new topic Submit Reply

   Displaying image data immediately w/out     Wed, 28 May 2003 05:06 Go to
   saving to Disk                                              next message
   sherwin
   Messages: 34          Occasional Poster [IMG] [IMG] [IMG]
   Registered: May 2003
   Location: Philippines
   Hi Mike,

   I appreciate your code in "Accessing MySQL Blob colums using VB6". Is it
   possible that after getting data from the database, we immediately load
   or display the image without saving to the local disk?
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Blob to Image without file         Wed, 28 May 2003 07:48 Go to previous
                                                  messageGo to next message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   It is in fact. The following code is not my own, but I cannot track the
   original author in order to give proper credit.

   PLACE THIS SECTION IN A MODULE

   Private Declare Function CreateStreamOnHGlobal Lib "ole32" ( _
   ByVal hGlobal As Long, _
   ByVal fDeleteOnRelease As Long, _
   ppstm As IStream) As Long

   Private Declare Function GetHGlobalFromStream Lib "ole32" ( _
   ByVal pstm As IStream, _
   phglobal As Long) As Long

   Private Declare Sub MoveMemory Lib "kernel32" _
   Alias "RtlMoveMemory" ( _
   Dest As Any, _
   src As Any, _
   ByVal cb As Long)

   ' Global Memory Flags
   Const GMEM_MOVEABLE = &H2
   Const GMEM_ZEROINIT = &H40

   Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)

   Private Declare Function GlobalAlloc Lib "kernel32" ( _
   ByVal wFlags As Long, _
   ByVal dwBytes As Long) As Long

   Private Declare Function GlobalSize Lib "kernel32" ( _
   ByVal hMem 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

   Const PictureID = &H746C&

   Private Type PictureHeader
   Magic As Long
   Size As Long
   End Type

   Const S_OK = 0

   '
   ' Picture2Array
   '
   ' Converts a Picture object to a byte array
   '
   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

   ' Get the IPersistStream interface
   Set oIPS = oObj

   ' Create a IStream object
   ' on global memory
   lRes = CreateStreamOnHGlobal(0, True, oStream)

   If lRes = S_OK Then

   ' Save the picture in the stream
   oIPS.Save oStream, True

   ' Get the global memory handle
   ' from the stream
   If GetHGlobalFromStream(oStream, hGlobal) = S_OK Then

   ' Get the memory size
   lSize = GlobalSize(hGlobal)

   ' Get a pointer to the memory
   lPtr = GlobalLock(hGlobal)

   If lPtr Then

   lSize = lSize - Len(Hdr)

   ' Redim the array
   ReDim aBytes(0 To lSize - 1)

   ' Copy the data to the array
   MoveMemory aBytes(0), ByVal lPtr + Len(Hdr), lSize

   End If

   ' Release the pointer
   GlobalUnlock hGlobal

   End If

   ' Release the IStream
   ' object
   Set oStream = Nothing

   End If

   End Sub

   '
   ' Array2Picture
   '
   ' Converts a byte array (which contains a valid picture) to a
   ' Picture object.
   '
   Public Function Array2Picture(aBytes() As Byte) As StdPicture
   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

   ' Create a new empty
   ' picture object
   Set Array2Picture = New StdPicture

   ' Get the IPersistStream interface
   Set oIPS = Array2Picture

   ' Calculate the array size
   lSize = UBound(aBytes) - LBound(aBytes) + 1

   ' Allocate global memory
   hGlobal = GlobalAlloc(GHND, lSize + Len(Hdr))

   If hGlobal Then

   ' Get a pointer to the memory
   lPtr = GlobalLock(hGlobal)

   ' Initialize the header
   Hdr.Magic = PictureID
   Hdr.Size = lSize

   ' Write the header
   MoveMemory ByVal lPtr, Hdr, Len(Hdr)

   ' Copy the byte array to
   ' the global memory
   MoveMemory ByVal lPtr + Len(Hdr), aBytes(0), lSize

   ' Release the pointer
   GlobalUnlock hGlobal

   ' Create a IStream object
   ' with the global memory
   lRes = CreateStreamOnHGlobal(hGlobal, True, oStream)

   If lRes = S_OK Then

   ' Load the picture
   ' from the stream
   'Set Form1.Picture1.Picture = oIPS.Load(oStream)
   oIPS.Load oStream
   Set frmMain.Picture1.Picture = oIPS
   End If
   ' Release the IStream
   ' object
   Set oStream = Nothing

   End If

   End Function[/code:1]

   THEN ASSUMING YOU HAVE A PICTUREBOX CALLED PICTURE1 AND YOUR STREAM
   OBJECT IS CALLED MYSTREAM, DO EVERY STEP BUT THE WRITE TO FILE AND ADD:
   mystream.Position = 0
   Picture1.Picture = Array2Picture(mystream.Read)[/code:1]

   and that will do it. The sample code is actually available in the zip
   archive of my presentation in San Jose:
   http://www.vbmysql.com/presentations/uc2003/presentation.exe


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately           Wed, 28 May 2003 19:15 Go to
   w/out saving to Disk                  previous messageGo to next message
   sherwin
   Messages: 34          Occasional Poster [IMG] [IMG] [IMG]
   Registered: May 2003
   Location: Philippines
   hi mike,

   I tried the code. I placed it in a section module. but when I ran it an
   error was generated "Compile Error: User-define type not defined." How
   should I go about this? I think I need to defined something inside the
   module, right?
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Where was the error?  Wed, 28 May 2003 19:31 Go to previous messageGo to
                                                               next message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   What line did the error occur on?


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately           Wed, 28 May 2003 21:22 Go to
   w/out saving to Disk                  previous messageGo to next message
   sherwin
   Messages: 34          Occasional Poster [IMG] [IMG] [IMG]
   Registered: May 2003
   Location: Philippines
   'OPEN RECORDSET TO READ BLOB
   rs.Open "Select * from files WHERE files.file_id = 1", conn
   mystream.Open
   mystream.Write rs!File 'Error here "operation is not allowed in this
   context"
   mystream.Position = 0
   Picture1.Picture = Array2Picture(mystream.Read)
   mystream.Close
   rs.Close
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately           Wed, 28 May 2003 22:05 Go to
   w/out saving to Disk                  previous messageGo to next message
   sherwin
   Messages: 34          Occasional Poster [IMG] [IMG] [IMG]
   Registered: May 2003
   Location: Philippines
   I already got it. many thanks to u mike. What I did is i included the
   dll that i downloaded from the link you've given. I forgot also to have
   the type of the stream and I also change the object name of the form.

   More power
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Good             Thu, 29 May 2003 06:04 Go to previous messageGo to next
                                                                    message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   I forgot about that DLL...

   I think I shall make this subject a future article.


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   i can't retrieve blob field    Wed, 01 October 2003 04:17 Go to previous
                                                  messageGo to next message
   oren
   Messages: 10             Freshman User [IMG]
   Registered: October 2003
   thanks to mike for the code..
   i can store the image in mysql but then..
   when i wanna query for search...
   i can't display the image stored in databse(blob)
   help me please..
   thanks
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately       Wed, 01 October 2003 07:18 Go to
   w/out saving to Disk                  previous messageGo to next message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   What does your code look like? Are you sure your BLOB got into the
   database properly?


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   blob              Wed, 01 October 2003 20:48 Go to previous messageGo to
                                                               next message
   oren
   Messages: 10             Freshman User [IMG]
   Registered: October 2003
   ya i'm pretty sure coz, when i select the image and insert some
   particular in database.. it's work properly.. but when i wanna query for
   search, for example i wanna search using ic number... i can't display
   the images for that ic number.. but i can pulled out the ic number and
   other particulars.

   Dim conn As ADODB.Connection
   Set conn = New ADODB.Connection

   Dim rs As ADODB.Recordset
   Set rs = New ADODB.Recordset

   Dim mystream As ADODB.Stream
   Set mystream = New ADODB.Stream

   conn.CursorLocation = adUseClient

   'conn.ConnectionString ("uid=user;pwd=user;server=192.168.0.169;" & _
   "driver={MySQL ODBC 3.51 Driver};database=image;dsn='';")

   conn.ConnectionString = "driver={MySQL ODBC 3.51
   Driver};database=image;dsn='';" _
   & "SERVER=192.168.0.169;" _
   & "UID=user;" _
   & "PWD=user;"

   conn.Open

   Dim cari As String
   cari = txtsearch.Text

   rs.Open "Select * from imej WHERE imej.ic = cari ", conn
   mystream.Open
   'mystream.Write rs!file

   mystream.Position = 0
   Picture1.Picture = Array2Picture(mystream.Read)
   lblic = rs("ic")
   lblnama = rs("nama")

   mystream.Close
   rs.Close

   the error = run time error '3219
   operation is not allowed in this context
   when i debug t he error at this line
   Picture1.Picture = Array2Picture(mystream.Read)

   ------------------------
   i also try another sample but then...

   error = run time error 545
   Unable to bind to field or DataMember: 'IMAGES'
   (Set Image1.DataSource = adoPrimaryRS)

   i can display the Text1
   but for Image1 can't

   Dim adoPrimaryRS As ADODB.Recordset
   Set adoPrimaryRS = New ADODB.Recordset
   Dim cnnConnection As ADODB.Connection
   Set cnnConnection = New ADODB.Connection

   cnnConnection.Open ("uid=user;pwd=user;server=192.168.0.169;" & _
   "driver={MySQL ODBC 3.51 Driver};database=image;dsn='';")

   adoPrimaryRS.Open "Select * from tbl_images", cnnConnection, _
   adOpenKeyset, adLockOptimistic

   'Bind the ole controls to the data provider
   Set Text1.DataSource = adoPrimaryRS
   Set Image1.DataSource = adoPrimaryRS

   ---------------------------------------------------

   the reason why i want the code coz now i'm trying to develop system that
   can access from various places. so we need to store the images in
   database and can pull out whenever we want anywhere.

   thanks in advance

   ---------------
   mid
   (the young beginner)
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately       Wed, 01 October 2003 21:17 Go to
   w/out saving to Disk                  previous messageGo to next message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   First of all, what did you use to put the image in?

   Second, I doubt that binding an image control to the recordset will
   work.

   If you save to file can you then read the file and see the picture?


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   blob              Wed, 01 October 2003 21:30 Go to previous messageGo to
                                                               next message
   oren
   Messages: 10             Freshman User [IMG]
   Registered: October 2003
   i use the code that you give earlier(the exe file). once we select the
   image file.. and insert particulars in database.. it's worked.
   but i can't read the image back for the second time

   below is my database

   ID file_name file_size file nama ic

   Edit Delete 10 tuty.JPG 10531 [BLOB - 10.3 KB] DD 123

   and actually i don't save the image to teh temporary file.. i just save
   the image directly to the databse
   i skipped this line
   mystream.SaveToFile Environ("temp") & "\copy.jpg", adSaveCreateOverWrite

   thanks for the reply mike
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately       Wed, 01 October 2003 21:32 Go to
   w/out saving to Disk                  previous messageGo to next message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   Yes, but if you DO save to the temp file can you view the image?


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   blob         Wed, 01 October 2003 21:51 Go to previous messageGo to next
                                                                    message
   oren
   Messages: 10             Freshman User [IMG]
   Registered: October 2003
   ya.. when i uncomment that line...
   i can see the copy image stored in my temp folder in my hard disk

   but i still can't displayed back the image stored in databse.. Crying or
   Very sad
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]
   Displaying image data immediately       Wed, 01 October 2003 21:55 Go to
   w/out saving to Disk                      previous messageGo to previous
                                                                    message
   Mike
   Messages: 946                      Power User
   Registered: May 2003               Site Admin
   Location: Calgary, Alberta, Canada
   And the image is not corrupt? I will have to check your code later when
   I have time.


   Regards,
   Mike Hillyer
   Webmaster/Moderator
   http://www.vbmysql.com
   Read my blog at: http://www.vbmysql.com/mike/blog
                                              Report message to a moderator
   [IMG]  Send a private message to this user                   [IMG] [IMG]

   Pages (2): [1  2  >  >>]    Switch to threaded view of this topic Create
                                                   a new topic Submit Reply

            Previous Topic: Array Dimensions Are Invalid
                Next Topic: How can i Print Image in Data report using Blob

   [__________]   [ Rate ]

   Goto Forum:
   [______________________________]   [ Go ]
                                             [ Syndicate this forum (XML) ]
                             -=] Back to Top [=-
                  Current Time: Fri Feb 27 16:17:10 MST 2004
   Total time taken to generate the page: 0.10450 seconds

                           .:: Contact :: Home ::.

                        Powered by: FUDforum 2.6.1RC1
            Copyright (c)2001-2004 Advanced Internet Designs Inc.