|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionThis explains how to perform drawing operations on a large image retrieved from the database, and then stream the image on the browser, with the "Open/Save" option. Getting the Image from DatabaseFor this sample code, I have a database table ImageTable which contains a column First, we need to fetch the image from the database. Since we need to do some drawing on the image, we convert the image into a ' This function returns the image retrieved from the database
Private Function GetImageFromDB(ByVal ImageID As Integer) As Image
Dim image As Image
...
...
Try
sqlCommand = "SELECT Image FROM ImageTable WHERE ImageID = "_
+ ImageID.ToString()
...
Dim dr As SqlDataReader
dr = cmd.ExecuteReader()
While (dr.Read())
Dim byt As Byte()
byt = dr.Item(strImage)
' Convert the image bytes to System.Drawing.Image
Dim bmp As New Bitmap(New System.IO.MemoryStream(byt))
image = bmp
End While
...
End Try
Return image
End Function
Now, we have to use this image and perform drawing operations on the image, and then stream it as a binary output to the browser. The image is retrieved as: Dim image As Image
image = GetImageFromDB(ImageID)
Getting a Graphics objectIn order to perform drawing operations on the image, we have to use the Dim bmpNew As Bitmap
Dim imageNew As Image
Dim objGraphics As Graphics
Try
objGraphics = Graphics.FromImage(image)
Catch e As Exception
' The image is in indexed pixel format
' Create a temp bitmap
bmpNew = New Bitmap(image.Width, image.Height)
imageNew = bmpNew
objGraphics = Graphics.FromImage(imageNew)
' Draw the contents of old bitmap to new bitmap
objGraphics.DrawImage(image, New Rectangle(0, 0, _
imageNew.Width, imageNew.Height), _
0, 0, image.Width, image.Height, _
GraphicsUnit.Pixel)
image = imageNew
End Try
Drawing on the imageThat would retrieve the image from the database and create a Dim objFont As Font = New Font("Verdana", 12, FontStyle.Bold)
Dim objbrush As Brush = Brushes.Black
Dim rect As New Drawing.RectangleF(10, 10, 200, 50)
Dim objGraphics As Graphics
objGraphics.DrawString("Simple Text", objFont, objbrush, rect)
Binary StreamingOnce we are done with the drawing operations on the image, we stream it to the browser. A simple ' Set the content type
Response.ContentType = "image/Jpeg"
Dim ms As MemoryStream = New MemoryStream()
image.Save(ms, Imaging.ImageFormat.Jpeg)
Dim bytImage(ms.Length) As Byte
bytImage = ms.ToArray()
ms.Close()
ms = New MemoryStream(bytImage)
Response.Clear()
Response.AddHeader("Content-Type", "binary/octet-stream")
Response.AddHeader("Content-Length", bytImage.Length.ToString())
Response.AddHeader("Content-Disposition", _
"attachment; filename=DownloadedImage.jpg; size=" _
+ bytImage.Length.ToString())
Response.Flush()
Dim chunkSize As Integer = 1024
Dim i As Integer
For i = 0 To bytImage.Length Step chunkSize
' Everytime check to see if the browser is still connected
If (Not Response.IsClientConnected) Then
Exit For
End If
Dim size As Integer = chunkSize
If (i + chunkSize >= bytImage.Length) Then
size = (bytImage.Length - i)
End If
Dim chunk(size - 1) As Byte
ms.Read(chunk, 0, size)
Response.BinaryWrite(chunk)
Response.Flush()
Next
ms.Close()
In this case, I read the bytes and stream them in sizes of 1024. The above code will ultimately throw a "file download" dialog with the "open/save" option, and the user can either open the image from the location or save it to his disk. This is achieved using the lines: Response.AddHeader("Content-Type", "binary/octet-stream")
Response.AddHeader("Content-Disposition", _
"attachment; filename=DownloadedImage.jpg; size=" _
+ bytImage.Length.ToString())
Without these lines, the image would be streamed directly to the client and will show up in the browser.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||