package ie.dcu.swt; import java.awt.image.*; import org.eclipse.swt.graphics.*; /** * Converts SWT ImageData objects to BufferedImage objects and vice-versa. * * @author Kevin McGuinness */ public class ImageConverter { public static BufferedImage convert(ImageData data) { ColorModel cm = null; PaletteData palette = data.palette; if (palette.isDirect) { cm = new DirectColorModel( data.depth, palette.redMask, palette.greenMask, palette.blueMask ); WritableRaster raster = cm.createCompatibleWritableRaster( data.width, data.height); BufferedImage im = new BufferedImage(cm, raster, false, null); int[] pixels = new int[3]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { int pixel = data.getPixel(x, y); RGB rgb = palette.getRGB(pixel); pixels[0] = rgb.red; pixels[1] = rgb.green; pixels[2] = rgb.blue; raster.setPixels(x, y, 1, 1, pixels); } } return im; } else { RGB[] rgbs = palette.getRGBs(); byte[] red = new byte[rgbs.length]; byte[] green = new byte[rgbs.length]; byte[] blue = new byte[rgbs.length]; for (int i = 0; i < rgbs.length; i++) { RGB rgb = rgbs[i]; red[i] = (byte) rgb.red; green[i] = (byte) rgb.green; blue[i] = (byte) rgb.blue; } if (data.transparentPixel != -1) { cm = new IndexColorModel( data.depth, rgbs.length, red, green, blue, data.transparentPixel ); } else { cm = new IndexColorModel( data.depth, rgbs.length, red, green, blue ); } WritableRaster raster = cm.createCompatibleWritableRaster( data.width, data.height); BufferedImage im = new BufferedImage(cm, raster, false, null); int[] pixels = new int[1]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { int pixel = data.getPixel(x, y); pixels[0] = pixel; raster.setPixel(x, y, pixels); } } return im; } } public static ImageData convertToSWT(BufferedImage im) { ColorModel cm = im.getColorModel(); if (cm instanceof DirectColorModel) { DirectColorModel dcm = (DirectColorModel) cm; PaletteData palette = new PaletteData( dcm.getRedMask(), dcm.getGreenMask(), dcm.getBlueMask() ); ImageData data = new ImageData( im.getWidth(), im.getHeight(), dcm.getPixelSize(), palette ); WritableRaster raster = im.getRaster(); int[] pixels = new int[3]; RGB rgb = new RGB(0,0,0); for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x, y, pixels); rgb.red = pixels[0]; rgb.green = pixels[1]; rgb.blue = pixels[2]; int pixel = palette.getPixel(rgb); data.setPixel(x, y, pixel); } } return data; } else if (cm instanceof IndexColorModel) { IndexColorModel icm = (IndexColorModel) cm; int size = icm.getMapSize(); byte[] reds = new byte[size]; byte[] greens = new byte[size]; byte[] blues = new byte[size]; icm.getReds(reds); icm.getGreens(greens); icm.getBlues(blues); RGB[] rgbs = new RGB[size]; for (int i = 0; i < rgbs.length; i++) { rgbs[i] = new RGB(reds[i] & 0xFF, greens[i] & 0xFF, blues[i] & 0xFF); } PaletteData palette = new PaletteData(rgbs); ImageData data = new ImageData( im.getWidth(), im.getHeight(), icm.getPixelSize(), palette ); data.transparentPixel = icm.getTransparentPixel(); WritableRaster raster = im.getRaster(); int[] pixels = new int[1]; for (int y = 0; y < data.height; y++) { for (int x = 0; x < data.width; x++) { raster.getPixel(x, y, pixels); data.setPixel(x, y, pixels[0]); } } return data; } return null; } }