Class Resample


  • public class Resample
    extends ImageToImageOperation
    Resizes grayscale and truecolor images using filters. For other image types (including paletted or bilevel images), you might want to use the ScaleReplication class or convert the images to grayscale (or RGB truecolor) first and then use this class. Several algorithms for resampling are implemented, they differ in resulting image quality and computational complexity.

    Usage example

    This will scale image to 150 percent of its original size in both directions, using the Lanczos3 filter type:
     Resample resample = new Resample();
     resample.setInputImage(image);
     resample.setSize(image.getWidth() * 3 / 2, image.getHeight() * 3 / 2);
     resample.setFilter(Resample.FILTER_TYPE_LANCZOS3);
     resample.process();
     PixelImage scaledImage = resample.getOutputImage();
     

    Known problems

    • Scaling down certain images (with stripe or checkers patterns in them) will lead to moire effects in the resulting image. These effects can be somewhat reduced by scaling down in several step (e.g. first from 1600 x 1200 to 800 x 600, then from 800 x 600 to 400 x 300, and so on).
    • Scaling down with filter type FILTER_TYPE_BOX can lead to errors in the scaled image. No fix known yet. Workaround: Use the class ScaleReplication.

    Origin

    This code is a port of Anders Melander's Object Pascal (Delphi) unit resample.pas to Java. The Delphi code is an adaptation (with some improvements) of Dale Schumacher's fzoom C code. Check out the homepage for the Delphi resample code, a demo application to compare the different filtering algorithms is also provided: http://www.melander.dk/delphi/resampler/index.html. You will also find the original C code there. The site seems to have gone for good.

    Theory

    The theoretical background for all implementations is Dale Schumacher's article General Filtered Image Rescaling in Graphics Gems III, editor David Kirk, Academic Press, pages 8-16, 1994.

    The Graphics Gems Repository can be found at http://www.acm.org/tog/GraphicsGems/. It also includes information on the books and how to order them.

    Author:
    Marco Schmidt
    • Field Detail

      • FILTER_TYPE_BOX

        public static final int FILTER_TYPE_BOX
        Constant for the Box filter (also known as Nearest Neighbor filter).
        See Also:
        Constant Field Values
      • FILTER_TYPE_TRIANGLE

        public static final int FILTER_TYPE_TRIANGLE
        Constant for the Triangle filter (also known as Linear filter or Bilinear filter).
        See Also:
        Constant Field Values
      • FILTER_TYPE_HERMITE

        public static final int FILTER_TYPE_HERMITE
        Constant for the Hermite filter.
        See Also:
        Constant Field Values
      • FILTER_TYPE_BELL

        public static final int FILTER_TYPE_BELL
        Constant for the Bell filter.
        See Also:
        Constant Field Values
      • FILTER_TYPE_B_SPLINE

        public static final int FILTER_TYPE_B_SPLINE
        Constant for the B-Spline filter.
        See Also:
        Constant Field Values
      • FILTER_TYPE_LANCZOS3

        public static final int FILTER_TYPE_LANCZOS3
        Constant for the Lanczos3 filter.
        See Also:
        Constant Field Values
      • FILTER_TYPE_MITCHELL

        public static final int FILTER_TYPE_MITCHELL
        Constant for the Mitchell filter.
        See Also:
        Constant Field Values
      • outWidth

        private Integer outWidth
      • outHeight

        private Integer outHeight
    • Constructor Detail

      • Resample

        public Resample()
    • Method Detail

      • createFilter

        private static ResampleFilter createFilter​(int filterType)
      • getFilter

        public ResampleFilter getFilter()
        Returns the filter to be used in this operation.
        Returns:
        ResampleFilter object or null if none was defined yet
      • getFilterNames

        public static String[] getFilterNames()
        Returns the names of all predefined filters. Each FILTER_TYPE_xyz constant can be used as an index into the array that is returned. Names are retrieved by creating an object of each predefined filter class and calling its getName method.
        Returns:
        String array with filter names
      • getNumFilters

        public static int getNumFilters()
        Returns the number of predefined filters.
        Returns:
        number of filters
      • process

        private void process​(IntegerImage in,
                             IntegerImage out)
        This method does the actual work of rescaling an image.
      • setSize

        public void setSize​(int width,
                            int height)
        Set the pixel resolution of the output image.
        Parameters:
        width - the horizontal resolution of the output image
        height - the vertical resolution of the output image
      • setFilter

        public void setFilter​(ResampleFilter newFilter)
        Set a new filter object to be used with this operation.
        Parameters:
        newFilter - a resample filter to be used for scaling
      • setFilter

        public void setFilter​(int filterType)
        Sets a new filter type, using the default sampling radius of that filter.
        Parameters:
        filterType - the new filter type, one of the FILTER_TYPE_xyz constants of this class
      • setFilter

        public void setFilter​(int filterType,
                              float samplingRadius)
        Sets a new filter type with a user-defined sampling radius.
        Parameters:
        filterType - the new filter type, one of the FILTER_TYPE_xyz constants of this class
        samplingRadius - the sampling radius to be used with that filter, must be larger than 0.0f