Encode and decode biometric images across many platforms and mobile devices faster and easier than ever before.

Key Features

Developer client/workstation licenses are provided free of charge
Supports many image formats including BMP, FAX, JPEG, JPEG-2000, PNG, PNM, RAW, VECTOR (NIST Format), and WSQ
Industry-leading WSQ performance
Easy-to-use interface
Includes NIST recommended 1000 DPI to 500 DPI downsampling algorithm
FBI-certified WSQ image quality
Simplified integration into Android applications
High-accuracy RAW image dimension detection
Supports any pixel scale including 500 and 1000 DPI
Conversion to and from platform specific image formats (e.g., java.awt.BufferedImage or
No explicit memory deallocation required
Supported on multiple platforms including Windows, Linux, Mac OS X, and Android

What is Image?

Image is an advanced cross-platform Java library that enables an application to read, write, and edit images in all common biometric image formats. It utilizes highly optimized state-of-the-art algorithms to achieve native code performance without the hassle of using the Java Native Interface(JNI).


Image is designed with biometric system and collection device software development in mind. It has built-in support for commonly required functions such as encoding raw images from a collection device, extracting subimages, downsampling 1000 DPI to 500 DPI, and much more!


Image includes a high-performance Wavelet Scalar Quantization (WSQ) image compression and decompression library. This library is written purely in Java and is the industry’s first pure Java WSQ algorithm to be certified by the Federal Bureau of Investigation (FBI). We guarantee the average quality of images will match or exceed the average quality of images encoded with any other certified library.

* A C# .Net Core version is also available and is FBI WSQ certified for Mac, Linux, and Windows.  Mobile versions for Android and iOS coming soon!


Image is trusted in the largest biometric systems as well as thousands of collection devices worldwide. Image handles the many nuances that are only learned through experience and not found in any image format specification. By incorporating Image, you can build on our experience and focus on the features important to your application.

Seeing is believing

See how Image SDK makes it easy to encode, decode, convert and manipulate images.

Decode an Image

* Read the image in using the ImageReader class, which can read from an
* InputStream, File, file path, or byte[]. The image format is optional
* and ImageReader will detect the image format. However, if the image
* format is specified, the operation will have a slight performance gain
Image image =;
Convert Image

/** Convert to WSQ with default encoding **/
Image wsqImg = image.toWsqImage();

/** Convert to WSQ with default bitrate (0.75f) and comments. Encoding WSQ
* with comments can store vital information that stays with the image
* and can be retreived when decoding.
Image wsqImg2 = image.toWsqImage("Encoded comment 1", "Encoded comment 2");

/** Convert to WSQ using a different bitrate.
* 0.75 bit rate ~= 15:1 compression ratio (standard)
* 2.25 bit rate ~= 5:1 compression ratio
Image wsqImg3 = image.toWsqImage(2.25f);

/** Convert to PNG image **/
Image pngImg = image.toPngImage();

/** Convert to JPEG2000 (JP2). Can specify bitrate (100 = lossless) **/
Image jp2Img = image.toJp2Image();

pngImg.toWsqImage(0.75f,"Encoded comment 1","Encoded comment 2");
WSQ to BufferedImage

Image wsqImg =;
* Must cast the object to BufferedImage. This is necessary for this library
* to be compatible on Android, since Android JRE does not have BufferedImage.
BufferedImage bufferedImage = (BufferedImage) wsqImg.toBufferedImage();
WSQ to Android Image

Image wsqImg =;
* Must cast the object to This is necessary for
* this library to be compatible on non-Android environments.
*/ androidImg = ( wsqImg.toAndroidImage();
Downsample 1000 DPI

/** Downsample by 50% using the NIST recommended downsampling approach **/
Image image500Dpi = image1000Dpi.downsampleGaussian50();
Rotate an Image

* Rotate about the center 45 degrees and fill in with white pixels.
* Also, the x and y point to rotate about can also be specified.
RawImage rawImg = img.rotate(Math.toRadians(45.0), Pixel.WHITE_PIXEL);

* Image can also convert the raster format of the an Image and rotate a
* raster.
Raster raster8bitGrayscale = img.toRawImage(RasterFormat.GRAY_8).getRaster();
Raster rotatedRaster = Rotate.rotate(raster8bitGrayscale, Math.toRadians(45.0));
* Create the image from a raster
RawImage rawImage = RawImage.fromRaster(rotatedRaster);