Link to home
Create AccountLog in
Avatar of TheWebGuy38
TheWebGuy38

asked on

Trying to resize an image in a memoryStream

I wrote a piece of code that grabs a fileupload, puts it into a memory stream, converts the main pic, and thumbnail pic, then saves them as jpegs, then updates the database.

Everything works fine, except one little glitch. If the DPI is above 300 then the image doesn't save right. It get's pixelated and blury. If anyone knows what is doing this, or how to solve it, I'd greatly appreciate the help.

here is the code.


#  Dim fileLen As Integer
#         Dim myStream As System.IO.Stream
#         Dim ImgContentType As String
#         Dim UserName = Dal.GetNickName(Dal.GetUserID)
#  
#         Dim FileUploadPicture As FileUpload = SuperFormAquariums.FindControl("FileUploadEditPicture")
#  
#         'Response.Write(FileUploadPicture.HasFile)
#         'Response.End()
#  
#         If FileUploadPicture.HasFile Then
#             'Create Dir
#             Dim nd As New DirectoryInfo(Server.MapPath("\" + Application("SysUserDir") & "\" & UserName & "\Aquariums\Picture\"))
#             If nd.Exists = False Then
#                 nd.Create()
#             End If
#  
#             'Create Dir
#             Dim nd2 As New DirectoryInfo(Server.MapPath("\" + Application("SysUserDir") & "\" & UserName & "\Aquariums\PictureThumb\"))
#             If nd2.Exists = False Then
#                 nd2.Create()
#             End If
#  
#  
#  
#             fileLen = FileUploadPicture.PostedFile.ContentLength
#             ImgContentType = FileUploadPicture.PostedFile.ContentType
#  
#             Dim Input(fileLen) As Byte
#             myStream = FileUploadPicture.PostedFile.InputStream
#             myStream.Read(Input, 0, fileLen)
#  
#             'Response.Write(fileLen)
#             'Response.End()
#  
#             Dim Filename = FileUploadPicture.PostedFile.FileName
#  
#             Dim Path1 = Server.MapPath("\" + Application("SysUserDir") & "\" & UserName & "\Aquariums\Picture\" & Filename)
#             Dim DataPath1 = "/" & UserName & "/Aquariums/Picture/" & Filename
#             Dim OldPath1 = Server.MapPath("/" & Application("SysUserDir") & "/" & e.OldValues("Picture"))
#  
#             Dim Path2 = Server.MapPath("\" + Application("SysUserDir") & "\" & UserName & "\Aquariums\PictureThumb\" & Filename)
#             Dim DataPath2 = "/" & UserName & "/Aquariums/PictureThumb/" & Filename
#             Dim OldPath2 = Server.MapPath("/" & Application("SysUserDir") & "/" & e.OldValues("PictureThumb"))
#  
#  
#             'Response.Write(DataPath1 & " " & DataPath2)
#             'Response.End()
#             'delete old image
#  
#             'delete old files
#             If FileUploadPicture.HasFile Then
#                 Dim fd1 As New FileInfo(OldPath1)
#                 If fd1.Exists = True Then
#                     fd1.Delete()
#                 End If
#             End If
#  
#             If FileUploadPicture.HasFile Then
#                 Dim fd2 As New FileInfo(OldPath2)
#                 If fd2.Exists = True Then
#                     fd2.Delete()
#                 End If
#             End If
#  
#  
#  
#  
#  
#             If File.Exists(Path1) Or File.Exists(Path2) Then
#  
#                 'LabelPhotos.Text = "Photo has not been added to the system"
#                 LabelConfirm.Text = "This photo image already exists in the system"
#                 e.Cancel = True
#  
#             Else
#  
#  
#  
#                 LabelConfirm.Text = ""
#                 Dim PictureInfoLarge = System.Drawing.Image.FromStream(myStream)
#  
#  
#  
#  
#                 'Get Picture To be Resized large
#                 Dim maxWidth1 As Integer = 800
#                 Dim maxHeight1 As Integer = 800
#                 Dim imgHeight1, imgWidth1 As Integer
#                 'Dim PictureInfo
#  
#  
#  
#                 imgHeight1 = PictureInfoLarge.Height
#                 imgWidth1 = PictureInfoLarge.Width
#  
#  
#                 ' Determine Scaling
#                 If imgWidth1 >= maxWidth1 Or imgHeight1 >= maxHeight1 Then
#                     'Determine what dimension is off by more
#                     Dim deltaWidth1 As Integer = imgWidth1 - maxWidth1
#                     Dim deltaHeight1 As Integer = imgHeight1 - maxHeight1
#                     Dim scaleFactor1 As Double
#  
#                     If deltaHeight1 > deltaWidth1 Then
#                         'Scale by the height
#                         scaleFactor1 = maxHeight1 / imgHeight1
#                     Else
#                         'Scale by the Width
#                         scaleFactor1 = maxWidth1 / imgWidth1
#                     End If
#  
#                     imgWidth1 *= scaleFactor1
#                     imgHeight1 *= scaleFactor1
#  
#                 Else
#  
#  
#                 End If
#  
#                 'Dim objThumbnail As System.Drawing.Image = PictureInfoLarge.GetThumbnailImage(imgWidth1, imgHeight1, Nothing, System.IntPtr.Zero)
#                 Dim objThumbnail As System.Drawing.Bitmap = PictureInfoLarge.GetThumbnailImage(imgWidth1, imgHeight1, Nothing, System.IntPtr.Zero)
#                 ' Dim graphicsImage As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(objThumbnail)
#  
#  'this is where the glitch is I think---------------supposed to fix -----------------------------------
#                 Dim graphicsImage As Graphics
#                 graphicsImage = Graphics.FromImage(objThumbnail)
#                 graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
#                 graphicsImage.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
#                 graphicsImage.DrawImage(objThumbnail, 0, 0, imgWidth1, imgHeight1)
#                 '--------------------------------------------------------------------
#                 graphicsImage.Save()
#  
#                 objThumbnail.Save(Path1, Imaging.ImageFormat.Jpeg)
#  
#                 'Response.Write(objThumbnail.PixelFormat & "<BR><BR>")
#                 'Response.Write(objThumbnail.PhysicalDimension)
#                 'Response.Write(objThumbnail.Size)
#  
#                 'Response.End()
#  
#  
#                 graphicsImage.Dispose()
#  
#                 e.NewValues("Picture") = DataPath1
#  
#                 PictureInfoLarge = Nothing
#                 objThumbnail = Nothing
#  
#  
#                 Dim PictureInfoSmall = System.Drawing.Image.FromStream(myStream)
#  
#  
#                 'Get Picture To be Resized small
#                 Dim maxWidth2 = 150
#                 Dim maxHeight2 = 150
#                 'imgHeight, imgWidth As Integer
#                 'Dim PictureInfo
#  
#  
#  
#                 Dim imgHeight2 = PictureInfoSmall.Height
#                 Dim imgWidth2 = PictureInfoSmall.Width
#  
#                 ' Determine Scaling
#                 If imgWidth2 >= maxWidth2 Or imgHeight2 >= maxHeight2 Then
#                     'Determine what dimension is off by more
#                     ' Dim deltaWidth As Integer = imgWidth - maxWidth
#                     'Dim deltaHeight As Integer = imgHeight - maxHeight
#                     ' Dim scaleFactor As Double
#                     Dim deltaWidth2 As Integer = imgWidth2 - maxWidth2
#                     Dim deltaHeight2 As Integer = imgHeight2 - maxHeight2
#                     Dim scaleFactor2 As Double
#  
#                     If deltaHeight2 > deltaWidth2 Then
#                         'Scale by the height
#                         scaleFactor2 = maxHeight2 / imgHeight2
#                     Else
#                         'Scale by the Width
#                         scaleFactor2 = maxWidth2 / imgWidth2
#                     End If
#  
#                     imgWidth2 *= scaleFactor2
#                     imgHeight2 *= scaleFactor2
#  
#                 Else
#  
#                 End If
#  
#  
#                 Dim objThumbnail2 As System.Drawing.Bitmap = PictureInfoSmall.GetThumbnailImage(imgWidth2, imgHeight2, Nothing, System.IntPtr.Zero)
#  
#                 '---------------supposed to fix -----------------------------------
#                 Dim graphicsImage2 As Graphics
#                 graphicsImage2 = Graphics.FromImage(objThumbnail2)
#                 graphicsImage2.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality
#                 graphicsImage2.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
#                 graphicsImage2.DrawImage(objThumbnail2, 0, 0, imgWidth1, imgHeight1)
#                 '--------------------------------------------------------------------
#                 graphicsImage2.Save()
#  
#                 objThumbnail2.Save(Path2, Imaging.ImageFormat.Jpeg)
#  
#                 graphicsImage2.Dispose()
#  
#  
#                 e.NewValues("PictureThumb") = DataPath2
#  
#  
#                 myStream.Close()
#                 myStream.Dispose()
#  
#                 PictureInfoSmall = Nothing
#                 objThumbnail2 = Nothing
#  
#  
#  
#  
#  
#  
#  
#             End If
#  
#  
#         ElseIf Not FileUploadPicture.HasFile Then
#  
#             'Dim PictureOld = CType(SuperFormAquariums.FindControl("HiddenFieldPictureEdit"), HiddenField).Value
#             'Dim PictureThumbOld = CType(SuperFormAquariums.FindControl("HiddenFieldPictureThumbedit"), HiddenField).Value
#             'Response.Write("new:" & e.NewValues("Picture") & " " & e.NewValues("PictureThumb") & " OLD: " & e.OldValues("Picture") & " " & e.OldValues("PictureThumb"))
#             'Response.End()
#  
#             e.NewValues("Picture") = e.OldValues("Picture")
#  
#             e.NewValues("PictureThumb") = e.OldValues("PictureThumb")
#  
#         End If

Open in new window

Avatar of HooKooDooKu
HooKooDooKu

Can't say for sure about what is causing your problem.  But having worked with code to scale images myself, I'm thinking the issue is going to be with the scale Factor.

Since you say the problem is this images greater than 300dpi, I'm thinking that because you are trying to limit the MAX size of the image (in pixels) in the code, that if you have a fixed size image (in inches) at various DPI settings, that you're getting pixelation when the actual image is much larger than the MAX size in pixels.

In other word, the code seems to be setting the MAX size of the image to be 800 PIXELS in either dimension.  Therefore, at 300DPI, you can't start with an image larger than 2-2/3" is size without causing the image to shrink.

What is the size (in pixels) of these images that are 300 DPI?  If I'm thinking about this correctly, then the real issue is that your scale factor less than 1 for these images.
Avatar of TheWebGuy38

ASKER

One image that does it is:

1280 x 720
24-bit color
72 PPI
From what I can see of a quick review of the code is that the MAX size is 800x800.  That means your 1280 x 720 image has GOT to loose some fidelity because you are going to shrink it down to 800 x 450.  That is a change from 921,600 pixels to 360,000 pixels, or a 60% reduction to total size.
I know it should loose resolution and dpi, but it shouldn't look like this


User generated image
Have you tried modifiying the Interpolation mode?
According the MSDN, Bicubic is "...not suitable for shrinking an image below 25 percent of its original size".  I assume they mean 25% of the linear size.  In your case, shinking an image from 1280 to 800 is a 37.5% reduction in linear size.  (My previous statement of 60% was % of AREA).
http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.interpolationmode.aspx
Anyone have any ideas?
ASKER CERTIFIED SOLUTION
Avatar of TheWebGuy38
TheWebGuy38

Link to home
membership
Create an account to see this answer
Signing up is free. No credit card required.
Create Account
This question has been classified as abandoned and is being closed as part of the Cleanup Program.  See my comment at the end of the question for more details.