* A wrapper for an image that uses the ImageIO Framework.
*/
public class ImageIOGenerator extends ImageGenerator {
protected void write(ImageWrapper wrapper, ImageWriter writer, float quality, boolean alpha) throws IOException {
BufferedImage bi = wrapper.getBufferedImage();
// Set some parameters
ImageWriteParam param = writer.getDefaultWriteParam();
if (param.canWriteCompressed() &&
quality >= 0.0 && quality <= 1.0) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
String[] types = param.getCompressionTypes();
// If compression types are defined, but none is set, set the first one,
// since setCompressionQuality, which requires MODE_EXPLICIT to be set,
// will complain otherwise.
if (types != null && param.getCompressionType() == null) {
param.setCompressionType(types[0]);
}
param.setCompressionQuality(quality);
}
if (param.canWriteProgressive())
param.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
// if bi has type ARGB and alpha is false, we have to tell the writer to not use the alpha channel:
// this is especially needed for jpeg files where imageio seems to produce wrong jpeg files right now...
if (bi.getType() == BufferedImage.TYPE_INT_ARGB
&& !alpha) {
// create a new BufferedImage that uses a WritableRaster of bi, with all the bands except the alpha band:
WritableRaster raster = bi.getRaster();
WritableRaster newRaster = raster.createWritableChild(
0, 0, raster.getWidth(), raster.getHeight(),
0, 0, new int[] {0, 1, 2 }
);
// create a ColorModel that represents the one of the ARGB except the alpha channel:
DirectColorModel cm = (DirectColorModel) bi.getColorModel();
DirectColorModel newCM = new DirectColorModel(
cm.getPixelSize(), cm.getRedMask(),
cm.getGreenMask(), cm.getBlueMask());
// now create the new buffer that is used ot write the image:
BufferedImage rgbBuffer = new BufferedImage(newCM,
newRaster, false, null);
writer.write(null, new IIOImage(rgbBuffer, null,
null), param);
} else {
writer.write(null, new IIOImage(bi, null, null),