Create high-quality thumbnail images

Thumbnail images are already supplied in certain image formats such as JPEG and TIFF. These are often provided by the camera used to take the picture and can be of very low resolution and sample quality. Unfortunately, if such an image exists you will be handed that one if you use the GetThumbnail method and such low quality images are of little use on screen because the thumbnail often needs to be enlarged before it can be used.

The only solution is to generate your own thumbnail image of the desired size from the full-sized original. This is accomplished by loading the original, creating an image of the desired size and drawing the original onto the thumbnail. The important thing is quality so in this example the interpolation mode quality is set to HighQualityBilinear which seems to give a slightly nicer effect than HighQualityBicubic. This setting is of course a matter of taste so perhaps you'd like to experiment to see which one you like the best.

    public Image GenerateThumbnail(Image original, int percentage)

    {

      if(percentage<1)

        throw new Exception("Thumbnail size must be aat least 1% of the original size");

      Bitmap tn=new Bitmap((int)(original.Width*0.01f*percentage),(int)(original.Height*0.01f*percentage));

      Graphics g=Graphics.FromImage(tn);

      g.InterpolationMode=InterpolationMode.HighQualityBilinear; //experiment with this...

      g.DrawImage(original, new Rectangle(0,0,tn.Width,tn.Height),0,0,original.Width,original.Height,GraphicsUnit.Pixel);

      g.Dispose();

      return (Image)tn;

    }

 

    Public Function GenerateThumbnail(original As Image, percentage As Integer) As Image

     If percentage < 1 Then

      Throw New Exception("Thumbnail size must be aat least 1% of the original size")

     End If

     Dim tn As New Bitmap(CInt(original.Width * 0.01F * percentage), _

                          CInt(original.Height * 0.01F * percentage))

     Dim g As Graphics = Graphics.FromImage(tn)

     g.InterpolationMode = InterpolationMode.HighQualityBilinear 'experiment with this...

     g.DrawImage(original, New Rectangle(0, 0, tn.Width, tn.Height), _

                 0, 0, original.Width, original.Height, GraphicsUnit.Pixel)

     g.Dispose()

     Return CType(tn, Image)

    End Function 'GenerateThumbnail

The original and a 25% generated thumbnail are shown below for comparison.

Figure 1. Original and thumbnail.

Return to Bob Powell's GDI+ FAQ.