I have a function that I want to pass the image and size to resize image. The issue I am seeing is that the original image looks very clear but the resized image is very distorted. I could see for a image enlarging but I am resizing to a much smaller image.
Here is my function:
Here is how I am calling this:Code:Public Function ResizeImage(ByVal sFileName As String, Optional iWidth As Integer = 230, Optional iHeight As Integer = 320) As Byte() Dim sFullFilePath As String = "http://www.domain.com/images/" & sFileName Dim _width As Integer = iWidth Dim _height As Integer = iHeight 'Set maximum width and height of image Dim MaxWidth As Integer = _width Dim MaxHeight As Integer = _height 'Create a plain white box Dim BlankImg As Bitmap = New Bitmap(_width, _height) Dim BlankGraphic As Graphics = Graphics.FromImage(BlankImg) BlankGraphic.FillRectangle(Brushes.White, New Rectangle(0, 0, BlankImg.Width, BlankImg.Height)) BlankGraphic.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic BlankGraphic.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality BlankGraphic.PixelOffsetMode = Drawing.Drawing2D.PixelOffsetMode.HighQuality BlankGraphic.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality 'Load image from web to add to new Bitmap Dim oPost As WebPost = New WebPost Dim s As Stream = New MemoryStream(oPost.SaveImageToByte(sFullFilePath)) 'download image to stream Dim OriginalImg As Bitmap = System.Drawing.Bitmap.FromStream(s) Dim ImgFormat As ImageFormat = OriginalImg.RawFormat 'grab the images format to save bitmap as later 'Resize image if either width or height is larger than the maximum allowed Dim iDiff As Integer = 0 Dim newX As Integer = 0 'Set the new top left drawing position on the image canvas Dim newY As Integer = 0 Dim wRatio As Decimal = 0 Dim newWidth As Integer = _width Dim newHeight As Integer = _height If (OriginalImg.Width > MaxWidth) Or (OriginalImg.Height > MaxHeight) Then 'Need to determine what dimension is larger. Dim iWidthDiff As Integer = OriginalImg.Width - MaxWidth Dim iHeigthDiff As Integer = OriginalImg.Height - MaxHeight If iWidthDiff > iHeigthDiff Then iDiff = OriginalImg.Width - MaxWidth newHeight = Convert.ToInt64(OriginalImg.Height - ((iDiff / OriginalImg.Width) * OriginalImg.Height)) newWidth = MaxWidth newX = 0 newY = Int((_height - newHeight) / 2) Else iDiff = OriginalImg.Height - MaxHeight newWidth = Convert.ToInt64(OriginalImg.Width - ((iDiff / OriginalImg.Height) * OriginalImg.Width)) newHeight = MaxHeight newX = Int((_width - newWidth) / 2) newY = 0 End If Else newHeight = OriginalImg.Height newWidth = OriginalImg.Width newX = Int((_width - newWidth) / 2) 'Position the image centrally across the canvas newY = Int((_height - newHeight) / 2) 'Position the image centrally down the canvas End If 'Add original image to graphic BlankGraphic.DrawImage(OriginalImg, newX, newY, newWidth, newHeight) Dim codecEncoder As ImageCodecInfo codecEncoder = GetEncoder("image/jpeg") Dim quality As Integer = 100 Dim encodeParams As New EncoderParameters(1) Dim qualityParam As New EncoderParameter(Imaging.Encoder.Quality, quality) encodeParams.Param(0) = qualityParam Dim imageBytes As Byte() = Nothing Using memoryStream As New MemoryStream() BlankImg.Save(memoryStream, codecEncoder, encodeParams) imageBytes = memoryStream.ToArray() End Using Return imageBytes End Function Function GetEncoder(ByVal mimeType As String) As ImageCodecInfo Dim codec As ImageCodecInfo Dim RetCodec As ImageCodecInfo = Nothing Dim codecs() As ImageCodecInfo = ImageCodecInfo.GetImageEncoders() For Each codec In codecs If codec.MimeType = mimeType Then RetCodec = codec End If Next Return RetCodec End Function
This version returns much clearer but images can be distorted because unlike the ResizeImage which will re-size proportionally.Code:Dim oImgFunc As image_functions = New image_functions Dim s As Byte() = oImgFunc.ResizeImage(sSrcImg, 140, 170) Dim imgItem As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(s) pCell.AddElement(New Phrase(New Chunk(imgItem, 0, 0)))
Any ideas why my ResizeImage isn't returning a clear image?Code:Dim sFullImgUrl As String = "http://www.domain.com/images/" & sSrcImg Dim oPost As WebPost = New WebPost Dim s As Stream = New MemoryStream(oPost.SaveImageToByte(sFullImgUrl)) Dim imgItem As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(s) imgItem.ScaleAbsolute(140, 170) imgItem.SetDpi(140, 170) pCell.AddElement(New Phrase(New Chunk(imgItem, 0, 0)))


Reply With Quote