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.