Resize image from postef file without saving to disk VB.net?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • pozze
    New Member
    • Feb 2008
    • 8

    Resize image from postef file without saving to disk VB.net?

    Hi,
    I've just made the change from ASP to .net.
    I have a file (code below) that saves a user submitted file to a MS SQL 2005 database. It collects the file name, file size, file type, and lastly the binary data for the file.
    I can sucessfully take the files out of the databse again and display them in a data grid.
    I would like to resize the submitted file to a fixed size (say 180 x 120) before I upload it to the database and do this without saving it to a temporary file on the servers HDD.
    I also do not want to use the "thumbnail method" as I want to keep the quality of the resized smaller images as high as possible.
    The code below is stripped down and does not have any validation to check for files that are not images etc, I will add that later. I also don't mind if i can only rezise and store in the database jpeg and gif files, but I need to be able handle at least these two image types.
    Code:
    <%@ Page Language="VB" ContentType="text/html" ResponseEncoding="iso-8859-1"%>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.OleDb" %>
    <%@ Import Namespace="System.Configuration" %>
    <script language="VB" runat="server">
    Public  Sub UploadBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
    
    'Get the posted file
    Dim fileDataStream As Stream =  MyFile.PostedFile.InputStream 
    
    'get file type
    Dim FileType As string = MyFile.PostedFile.ContentType
    'Get size of file
    Dim fileLength As Integer =  MyFile.PostedFile.ContentLength 
     
    'Create a byte array with file length
    Dim fileData() As Byte =  New Byte(fileLength) {} 
     
    'Read the stream into the byte array
    fileDataStream.Read(fileData,0,fileLength)
    
    'get file name (excluding the path)
          Dim strFileNamePath as String = MyFile.PostedFile.FileName
    	  Dim intFileNameLength = Instr(1, StrReverse(strFileNamePath), "\")
          Dim strFileNameOnly as String = Mid(strFileNamePath, (Len(strFileNamePath)-intFileNameLength)+2)
    
       		Dim DBConnection As New OleDbConnection(ConfigurationSettings.AppSettings("MSEMM_Connection_string"))
    		Dim UpdateCommand as new oledbcommand
    			UpdateCommand.Connection = DBConnection
    			UpdateCommand.Commandtype = Commandtype.text 
    			UpdateCommand.Commandtext= "INSERT INTO dbo.Files (FileName, FileSize, ContentType, FileData) Values(?,?,?,?)"
    			UpdateCommand.Parameters.AddWithValue("?", strFileNameOnly)
    			UpdateCommand.Parameters.AddWithValue("?", fileLength)
    			UpdateCommand.Parameters.AddWithValue("?", FileType)
    			UpdateCommand.Parameters.AddWithValue("?", fileData)
    										
    		DBConnection.open()
    		UpdateCommand.ExecuteNonQuery
    		DBConnection.Close()
    	
    End Sub
    </script>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>file upload test</title>
    </head>
    <body>
    <h3>File Upload</h3>
    
    <hr>
    <asp:label id="Message" Text="Select a file and filename" runat="server"/>
    <hr>
    
    <h3>File Upload</h3>
    
    <form enctype="multipart/form-data" runat="server">
       File: <input id="myFile" type="file" runat="server">
       <input type=button value="Upload" OnServerClick="UploadBtn_Click" runat="server">
    </form>
    </body>
    </html>
  • pozze
    New Member
    • Feb 2008
    • 8

    #2
    After some more work I've come up with this, it doesn't come up with an error at run time, and when i check the database there is data in it and the size of the file has decreased, but the image doesn't display, the other images in the database the were uploaded with the original file work fine.
    The code of the updated file is below.
    Code:
    <%@ Page Language="VB" ContentType="text/html" ResponseEncoding="iso-8859-1" debug="true"%>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Data.OleDb" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Drawing" %>
    <%@ Import Namespace="System.Drawing.Imaging" %>
    <%@ Import Namespace="System.Drawing.Drawing2D" %>
    <script language="VB" runat="server">
    Public  Sub UploadBtn_Click(ByVal sender As Object, ByVal e As EventArgs)
    
    'Get the posted file
    Dim fileDataStream As Stream =  MyFile.PostedFile.InputStream 
    
    'get file type
    Dim FileType As string = MyFile.PostedFile.ContentType
    'Get size of file
    Dim fileLength As Integer =  MyFile.PostedFile.ContentLength 
     
    'Create a byte array with file length
    Dim fileData() As Byte =  New Byte(fileLength) {} 
     
    'Read the stream into the byte array
    fileDataStream.Read(fileData,0,fileLength)
    
    
    Dim origImg As System.Drawing.Image
    	origImg = System.Drawing.Image.FromStream(fileDataStream)
    Dim imageWidth As Integer = origImg.Width
    Dim imageHeight As Integer = origImg.Height
    
    
    Dim processedBP As Bitmap = New Bitmap (180, 120)
    Dim g As Graphics = Graphics.FromImage(processedBP)
    	g.SmoothingMode = SmoothingMode.HighQuality
    	g.InterpolationMode = InterpolationMode.HighQualityBicubic
    	g.PixelOffsetMode = PixelOffsetMode.HighQuality
    Dim rect As Rectangle = New Rectangle (0, 0, 180, 120)
    	g.DrawImage(origImg, rect, 0, 0, origImg.Width, origImg.Height,GraphicsUnit.Pixel)
    	
    Dim processedMemStream As MemoryStream = New MemoryStream ()
    processedBP.Save(processedMemStream, ImageFormat.Jpeg)
    dim FileType2 as string = "image/jpeg"
    
    'Dim processedImageData As Byte = processedMemStream.ToArray()
    Dim fileLength2 As Integer = processedMemStream.Length.ToString()
    Dim fileData2() As Byte =  New Byte(fileLength2) {}
    processedMemStream.Read(fileData2,0,fileLength2)
    
    'get file name (excluding the path)
          Dim strFileNamePath as String = MyFile.PostedFile.FileName
    	  Dim intFileNameLength = Instr(1, StrReverse(strFileNamePath), "\")
          Dim strFileNameOnly as String = Mid(strFileNamePath, (Len(strFileNamePath)-intFileNameLength)+2)
    
       		Dim DBConnection As New OleDbConnection(ConfigurationSettings.AppSettings("MSEMM_Connection_string"))
    		Dim UpdateCommand as new oledbcommand
    			UpdateCommand.Connection = DBConnection
    			UpdateCommand.Commandtype = Commandtype.text 
    			UpdateCommand.Commandtext= "INSERT INTO dbo.Files (FileName, FileSize, ContentType, FileData) Values(?,?,?,?)"
    			UpdateCommand.Parameters.AddWithValue("?", strFileNameOnly)
    			UpdateCommand.Parameters.AddWithValue("?", fileLength2)
    			UpdateCommand.Parameters.AddWithValue("?", FileType2)
    			UpdateCommand.Parameters.AddWithValue("?", fileData2)
    										
    		DBConnection.open()
    		UpdateCommand.ExecuteNonQuery
    		DBConnection.Close()
    	
    End Sub
    </script>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>file upload test</title>
    </head>
    <body>
    <h3>File Upload</h3>
    
    <hr>
    <asp:label id="Message" Text="Select a file and filename" runat="server"/>
    <hr>
    
    <h3>File Upload</h3>
    
    <form enctype="multipart/form-data" runat="server">
       File: <input id="myFile" type="file" runat="server">
       <input type=button value="Upload" OnServerClick="UploadBtn_Click" runat="server">
    </form>
    </body>
    </html>

    Comment

    • pozze
      New Member
      • Feb 2008
      • 8

      #3
      Don't worry I've sorted it out myself, I will post the code when i have prettied it up.

      Comment

      • kenobewan
        Recognized Expert Specialist
        • Dec 2006
        • 4871

        #4
        Well done, we gave you the placebo and it worked ;)

        Comment

        Working...