5
votes

i was searching google for some kind solution and i found one, i tried to implement it in my code but it doesn't work. The problem is that after resizing white images they gets gray border.

Here is the link of soloution i found:

It says: This problem is occuring because you are interpolating your image data to a new size, but along the edges there are no pixels to interpolate and .NET uses black pixels for these edges by default. To fix this you need to use an ImageAttributes class in your DrawImage call....

https://groups.google.com/group/microsoft.public.dotnet.framework.drawing/browse_thread/thread/d834851b49274fd9/81a4fd43694457ac?hl=en&lnk=st&q=DrawImage+resized+border#81a4fd43694457ac

CODE 1: And this is my code WITH IMPLEMENTATION OF ImageAttributes:

Private Shared Function ResizeImageFile(ByVal imageFile As Byte(), ByVal targetSize As Integer) As Byte()

    Using oldImage As System.Drawing.Image = System.Drawing.Image.FromStream(New MemoryStream(imageFile))

        Dim newSize As Size = CalculateDimensions(oldImage.Size, targetSize)

        Using newImage As New Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)

            Using canvas As Graphics = Graphics.FromImage(newImage)

                Using ia As New ImageAttributes

                    ia.SetWrapMode(Drawing2D.WrapMode.TileFlipXY)
                    canvas.SmoothingMode = SmoothingMode.AntiAlias
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality
                    canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png)
                    Return m.GetBuffer()

                End Using

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function

CODE 2: CODE THAT COUSES A GRAY BORDER ON WHITE IMAGE

Here is the image after resizing:

enter image description here

new image size in width = 400px

Private Shared Function ResizeImageFile(ByVal imageFile As Byte(), ByVal targetSize As Integer) As Byte()

    Using oldImage As System.Drawing.Image = System.Drawing.Image.FromStream(New MemoryStream(imageFile))

        Dim newSize As Size = CalculateDimensions(oldImage.Size, targetSize)

        Using newImage As New Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)

            Using canvas As Graphics = Graphics.FromImage(newImage)

                    canvas.SmoothingMode = SmoothingMode.AntiAlias
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality
                    canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize))

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png)
                    Return m.GetBuffer()

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function

UPDATE 30.07.2011.:

CODE 1 solved the problem with the gray borders on white images, but there is new problem. The problem is in this line of code:

canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

With this code I get output image with desired width and height and without gray borders but the oldImage isn't scaled.

For example:

If I want to upload, resize and save the image that is orginaly for instance 640x480px and that the targetSize is 400px. As output I get an image that is width: 400px, height: 300px, without gray borders, but oldImage isn't resized/scaled to 400px. Insted of this, oldImage is drawn with the original resolution. How to scale oldImage to be drawn correctly? Can someone point me to the right solution or modify the code?

Thanx to everyone, but I found the solution to all my problems.

The CODE 1 didn't work correctly because of the following line of code:

canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, newImage.Width, newImage.Height, GraphicsUnit.Pixel, ia)

SOLUTION:

canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, oldImage.Width, oldImage.Height, GraphicsUnit.Pixel, ia)

HERE IS THE FULL WORKING CODE (resized image without gray/black borders):

Private Shared Function ResizeImageFile(ByVal imageFile As Byte(), ByVal targetSize As Integer) As Byte()

    Using oldImage As System.Drawing.Image = System.Drawing.Image.FromStream(New MemoryStream(imageFile))

        Dim newSize As Size = CalculateDimensions(oldImage.Size, targetSize)

        Using newImage As New Bitmap(newSize.Width, newSize.Height, PixelFormat.Format32bppRgb)

            Using canvas As Graphics = Graphics.FromImage(newImage)

                Using ia As New ImageAttributes

                    ia.SetWrapMode(Drawing2D.WrapMode.TileFlipXY)
                    canvas.SmoothingMode = SmoothingMode.AntiAlias
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality
                    canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize), 0, 0, oldImage.Width, oldImage.Height, GraphicsUnit.Pixel, ia)

                    Dim m As New MemoryStream()

                    newImage.Save(m, ImageFormat.Png)
                    Return m.GetBuffer()

                End Using

            End Using

        End Using

    End Using

End Function

Private Shared Function CalculateDimensions(ByVal oldSize As Size, ByVal targetSize As Integer) As Size

    Dim newSize As New Size()

    If oldSize.Height > oldSize.Width Then

        newSize.Width = CInt((oldSize.Width * (CSng(targetSize) / CSng(oldSize.Height))))
        newSize.Height = targetSize

    Else

        newSize.Width = targetSize
        newSize.Height = CInt((oldSize.Height * (CSng(targetSize) / CSng(oldSize.Width))))

    End If

    Return newSize

End Function
1
Not sure what the question is. You've got a problem and you found a solution.Denis
@Antonio, can you provide a sample image that's not working and what the dimensions of newSize will be so we can see what you're seeing. I tried the code you provided and I don't see an issue. (Although technically I wouldn't really call this resizing an image, you're really just drawing the old image on a larger canvas.)Chris Haas
Here's a good article on image resizing pitfalls if you run into any more problems. Also, have you seen imageresizing.net? It's essential if you're doing this for an ASP.NET project..Lilith River
If you have working code I believe you should really post it as an answer and mark it correct so that this question no longer shows up under unanswered and it is easier for people to use as a reference if they find this page from Google or whatever.SeriousSamP

1 Answers

1
votes

Here is a function out of a class I have, you will have to replace some of the class Properties(ThumbNailSize.Width, ThumbNailSize.Height):

public void ResizeImage(HttpPostedFile fil, string sPhysicalPath, 
                              string sOrgFileName,string sThumbNailFileName,
                              ImageFormat oFormat, int rez)
{

    try
    {

        System.Drawing.Image oImg = System.Drawing.Image.FromStream(fil.InputStream);

        decimal pixtosubstract = 0;
        decimal percentage;

        //default
        Size ThumbNailSizeToUse = new Size();
        if (ThumbNailSize.Width < oImg.Size.Width || ThumbNailSize.Height < oImg.Size.Height)
        {
            if (oImg.Size.Width > oImg.Size.Height)
            {
                percentage = (((decimal)oImg.Size.Width - (decimal)ThumbNailSize.Width) / (decimal)oImg.Size.Width);
                pixtosubstract = percentage * oImg.Size.Height;
                ThumbNailSizeToUse.Width = ThumbNailSize.Width;
                ThumbNailSizeToUse.Height = oImg.Size.Height - (int)pixtosubstract;
            }
            else
            {
                percentage = (((decimal)oImg.Size.Height - (decimal)ThumbNailSize.Height) / (decimal)oImg.Size.Height);
                pixtosubstract = percentage * (decimal)oImg.Size.Width;
                ThumbNailSizeToUse.Height = ThumbNailSize.Height;
                ThumbNailSizeToUse.Width = oImg.Size.Width - (int)pixtosubstract;
            }

        }
        else
        {
            ThumbNailSizeToUse.Width = oImg.Size.Width;
            ThumbNailSizeToUse.Height = oImg.Size.Height;
        }

        Bitmap bmp = new Bitmap(ThumbNailSizeToUse.Width, ThumbNailSizeToUse.Height);
        bmp.SetResolution(rez, rez);
        System.Drawing.Image oThumbNail = bmp;

        bmp = null;

        Graphics oGraphic = Graphics.FromImage(oThumbNail);

        oGraphic.CompositingQuality = CompositingQuality.HighQuality;

        oGraphic.SmoothingMode = SmoothingMode.HighQuality;

        oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic;

        Rectangle oRectangle = new Rectangle(0, 0, ThumbNailSizeToUse.Width, ThumbNailSizeToUse.Height);

        oGraphic.DrawImage(oImg, oRectangle);

        oThumbNail.Save(sPhysicalPath  + sThumbNailFileName, oFormat);

        oImg.Dispose();

    }
    catch (Exception ex)
    {
        Response.Write(ex.Message);
    }

}