Convert System.Drawing.Image to FileStream

  • Thread starter Thread starter Toby Mathews
  • Start date Start date
T

Toby Mathews

Hi,

In an ASP.Net application I want to convert open create a FileStream
object from a System.Drawing.Image - is this possible? I create an instance
of an Image object using the FromFile method, then use the GetThumbnailImage
method to create a second Image. This second one is the one I want to get a
FileStream from, so that I can then use its Handle to use Response.WriteFile
to output the thumbnail on my ASP.Net page.

Any help would be much appreciated - I realise I may not even be going
about this in the most appropriate way! Thanks in advance,

Toby Mathews
 
Apologies, first line should read:

"In an ASP.Net application I want to create a FileStream..."
 
Hi Toby,

I made a sample that works. In a nice way.
It is not a thumbnail, but that you can make using the memorystream.
It is imposible to put an image from a stream direct on a webpage.
A webpage can only show an IMG.
If you want to use a thumbnail, you first needs to convert that there is a
special class for that.

I hope this is something you need.


\\\For the database the image database sample from the Resource kit is used.
\\\It needs 2 forms with on form1 a listbox, a picturebox and a label and
on form2 nothing
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Dim conn As New SqlClient.SqlConnection _
("Server=localhost;" & "DataBase=Northwind;" & _
"Integrated Security=SSPI")
Dim cmd As New SqlClient.SqlCommand("SELECT FileName, PictureID
FROM Picture", conn)
Dim da As New SqlClient.SqlDataAdapter(cmd)
Dim dsPictures As New DataSet
da.Fill(dsPictures)
Me.Image1.Visible = False
ListBox1.AutoPostBack = True
Try
ListBox1.DataSource = dsPictures.Tables(0)
ListBox1.DataTextField = "FileName"
ListBox1.DataValueField = "PictureID"
ListBox1.DataBind()
Catch sqlExc As SqlClient.SqlException
Me.Label1.Text = "Database Error"
Catch exc As Exception
Me.Label1.Text = "Datbase Connection Failed!"
End Try
conn.Close()
End If
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender _
As System.Object, ByVal e As System.EventArgs) Handles
ListBox1.SelectedIndexChanged
Session.Item("img") = ListBox1.SelectedItem.Value
Image1.Visible = True
Image1.ImageUrl = "http://localhost/WebApplication1/WebForm2.aspx"
End Sub
///
\\\
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim conn As New SqlClient.SqlConnection("Server=localhost;" & _
"DataBase=Northwind;" & "Integrated Security=SSPI")
Dim sqlstr As String = _
String.Format("SELECT Picture FROM Picture WHERE (PictureID = {0})",
CInt(Session.Item("img")))
Dim cmd As New SqlClient.SqlCommand(sqlstr, conn)
conn.Open()
Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()
rdr.Read()
Response.BinaryWrite(CType(rdr.Item("Picture"), Byte()))
rdr.Close()
conn.Close()
End Sub
///
I hope this helps a little bit?

Cor
 
Hi Toby
I made a sample that works in a nice way.
It is not a thumbnail, but that you can make using the memorystream.
Skip that row above was an error I forgot to delete.
It is imposible to put an image from a stream direct on a webpage.
A webpage can only show an IMG.
If you want to use a thumbnail, you first needs to convert that there is a
special class for that.
Cor
 
Cor,

Thanks for the reply, I don't think that's quite what I'm after and I
can't see how to adapt it. Here's some example code to try to show what it
is I want to do (I'm using C# but I can understand your VB):

// First get my original image.
System.Drawing.Image.GetThumbnailImageAbort myCallback = new
System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
System.Drawing.Image img = System.Drawing.Image.FromFile(@"c:\img.jpg");

// Then make the thumbnail
img = img.GetThumbnailImage(100, 100, myCallback, IntPtr.Zero);

// Then somehow make the FileStream and get a reference to the FileHandle.
FileStream MyFileStream = ... // don't know what to do here?
IntPtr FileHandle = MyFileStream.Handle;

// Finally write this.
Response.WriteFile(FileHandle, 0, MyFileStream.Length);

Does that make sense?

Thanks for your help so far, and apologies if I have missed something in
your reply.

Toby
 
Hi Toby,

I changed it so it works now with a thumbnail.
That hard it cannot be to change it in C#

The changes are all on the second form.
What is the trick.
It is posible to send a bytearray to a webpage and that will create a form.
But that image is immidiatly also the page.
Not nice such a page in the left uperside of the form and no text.

The trick is to make such a page and than use that page "the URL" as the
imput for your your real image on page. That page is my form1.

I will try to make it as C# also but not today or tomorrow I think.

I hope this does help you

Cor

\\\\
Private Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim conn As New SqlClient.SqlConnection("Server=localhost;" & _
"DataBase=Northwind;" & "Integrated Security=SSPI")
Dim sqlstr As String = _
String.Format("SELECT Picture FROM Picture WHERE (PictureID = {0})",
CInt(Session.Item("img")))
Dim cmd As New SqlClient.SqlCommand(sqlstr, conn)
conn.Open()
Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()
rdr.Read()
Dim arrImage() As Byte
arrImage = (CType(rdr.Item("Picture"), Byte()))
Dim ms1 As New System.IO.MemoryStream(arrImage)
Dim origimage As System.drawing.Image
origimage = System.Drawing.Image.FromStream(ms1)
Dim PThumbnail As System.drawing.Image
PThumbnail = origimage.GetThumbnailImage(100, 100, Nothing, New
IntPtr)
Dim ms2 As New System.IO.MemoryStream
PThumbnail.Save(ms2, Imaging.ImageFormat.Bmp)
arrImage = ms2.GetBuffer
Response.BinaryWrite(arrImage)
rdr.Close()
conn.Close()
End Sub
///
 
Cor,

Thanks a lot, that's exactly what I needed! I was almost doing the right
thing, but I was using the FileStream rather than MemoryhStream. Thanks
again,

Toby
 
I think this is what you are looking for. mynewimage is your
system.drawing.image. You may have to change the format. You also might want
to add Response.ContentType = "image/jpeg" before you output the stream.

mynewimage.Save(Response.OutputStream, ImageFormat.Jpeg)
 
Back
Top