net.sourceforge.jiu.geometry

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

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

Nested Class Summary

(package private) class
Resample.CList
(package private) class
Resample.Contributor

Field Summary

static int
FILTER_TYPE_BELL
Constant for the Bell filter.
static int
FILTER_TYPE_BOX
Constant for the Box filter (also known as Nearest Neighbor filter).
static int
FILTER_TYPE_B_SPLINE
Constant for the B-Spline filter.
static int
FILTER_TYPE_HERMITE
Constant for the Hermite filter.
static int
FILTER_TYPE_LANCZOS3
Constant for the Lanczos3 filter.
static int
FILTER_TYPE_MITCHELL
Constant for the Mitchell filter.
static int
FILTER_TYPE_TRIANGLE
Constant for the Triangle filter (also known as Linear filter or Bilinear filter).
private ResampleFilter
filter
private Integer
outHeight
private Integer
outWidth

Fields inherited from class net.sourceforge.jiu.ops.ImageToImageOperation

canInAndOutBeEqual, inputImage, outputImage

Fields inherited from class net.sourceforge.jiu.ops.Operation

abort, progressListeners

Method Summary

private static ResampleFilter
createFilter(int filterType)
ResampleFilter
getFilter()
Returns the filter to be used in this operation.
static String[]
getFilterNames()
Returns the names of all predefined filters.
static int
getNumFilters()
Returns the number of predefined filters.
void
process()
private void
process(IntegerImage in, IntegerImage out)
This method does the actual work of rescaling an image.
void
setFilter(int filterType)
Sets a new filter type, using the default sampling radius of that filter.
void
setFilter(int filterType, float samplingRadius)
Sets a new filter type with a user-defined sampling radius.
void
setFilter(ResampleFilter newFilter)
Set a new filter object to be used with this operation.
void
setSize(int width, int height)
Set the pixel resolution of the output image.

Methods inherited from class net.sourceforge.jiu.ops.ImageToImageOperation

canInputAndOutputBeEqual, ensureImagesHaveSameResolution, ensureInputImageIsAvailable, ensureOutputImageResolution, getInputImage, getOutputImage, setCanInputAndOutputBeEqual, setInputImage, setOutputImage

Methods inherited from class net.sourceforge.jiu.ops.Operation

addProgressListener, addProgressListeners, getAbort, process, removeProgressListener, setAbort, setProgress, setProgress

Field Details

FILTER_TYPE_BELL

public static final int FILTER_TYPE_BELL
Constant for the Bell filter.
Field Value:
3

FILTER_TYPE_BOX

public static final int FILTER_TYPE_BOX
Constant for the Box filter (also known as Nearest Neighbor filter).
Field Value:
0

FILTER_TYPE_B_SPLINE

public static final int FILTER_TYPE_B_SPLINE
Constant for the B-Spline filter.
Field Value:
4

FILTER_TYPE_HERMITE

public static final int FILTER_TYPE_HERMITE
Constant for the Hermite filter.
Field Value:
2

FILTER_TYPE_LANCZOS3

public static final int FILTER_TYPE_LANCZOS3
Constant for the Lanczos3 filter.
Field Value:
5

FILTER_TYPE_MITCHELL

public static final int FILTER_TYPE_MITCHELL
Constant for the Mitchell filter.
Field Value:
6

FILTER_TYPE_TRIANGLE

public static final int FILTER_TYPE_TRIANGLE
Constant for the Triangle filter (also known as Linear filter or Bilinear filter).
Field Value:
1

filter

private ResampleFilter filter

outHeight

private Integer outHeight

outWidth

private Integer outWidth

Method Details

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

public void process()
            throws MissingParameterException,
                   WrongParameterException
Overrides:
process in interface Operation

process

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

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

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

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