// Copyright 2001-2007, FreeHEP. package org.xmind.org.freehep.util.images; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ImageObserver; import java.awt.image.Raster; import java.awt.image.RenderedImage; /** * @author Mark Donszelmann * @version $Id: ImageUtilities.java 10366 2007-01-22 19:16:34Z duns $ */ public class ImageUtilities { private ImageUtilities() { } public static RenderedImage createRenderedImage(Image image, ImageObserver observer, Color bkg) { if ((bkg == null) && (image instanceof RenderedImage)) return (RenderedImage) image; BufferedImage bufferedImage = new BufferedImage( image.getWidth(observer), image.getHeight(observer), (bkg == null) ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.getGraphics(); if (bkg == null) { g.drawImage(image, 0, 0, observer); } else { g.drawImage(image, 0, 0, bkg, observer); } return bufferedImage; } public static BufferedImage createBufferedImage(RenderedImage image, ImageObserver observer, Color bkg) { if (image instanceof BufferedImage) return (BufferedImage) image; throw new IllegalArgumentException("not supperted " + image.getClass()); //$NON-NLS-1$ } public static BufferedImage createBufferedImage(Image image, ImageObserver observer, Color bkg) { if ((bkg == null) && (image instanceof BufferedImage)) return (BufferedImage) image; return (BufferedImage) createRenderedImage(image, observer, bkg); } public static RenderedImage createRenderedImage(RenderedImage image, Color bkg) { if (bkg == null) return image; BufferedImage bufferedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D) bufferedImage.getGraphics(); g.setBackground(bkg); g.clearRect(0, 0, image.getWidth(), image.getHeight()); g.drawRenderedImage(image, new AffineTransform()); return bufferedImage; } public static byte[] getBytes(Image image, Color bkg, String code, int pad, ImageObserver observer) { return getBytes(createRenderedImage(image, observer, bkg), bkg, code, pad); } /** * Returns the bytes of an image. * * @param image * to be converted to bytes * @param bkg * the color to be used for alpha-multiplication * @param code * ARGB, A, or BGR, ... you may also use *ARGB to pre-multiply * with alpha * @param pad * number of bytes to pad the scanline with (1=byte, 2=short, * 4=int, ...) */ public static byte[] getBytes(RenderedImage image, Color bkg, String code, int pad) { if (pad < 1) pad = 1; Raster raster = image.getData(); int width = image.getWidth(); int height = image.getHeight(); boolean preMultiply = (code.charAt(0) == '*'); if (preMultiply) code = code.substring(1); int pixelSize = code.length(); int size = width * height * pixelSize; size += (width % pad) * height; int index = 0; byte[] bytes = new byte[size]; ColorModel colorModel = image.getColorModel(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int argb = colorModel.getRGB(raster.getDataElements(x, y, (Object) null)); int a = ((argb >> 24) & 0xFF); int r = ((argb >> 16) & 0xFF); int g = ((argb >> 8) & 0xFF); int b = ((argb >> 0) & 0xFF); // Check the transparancy. If transparent substitute // the background color. if (preMultiply && (a < 0xFF)) { if (bkg == null) bkg = Color.BLACK; double alpha = a / 255.0; r = (int) (alpha * r + (1 - alpha) * bkg.getRed()); g = (int) (alpha * g + (1 - alpha) * bkg.getGreen()); b = (int) (alpha * b + (1 - alpha) * bkg.getBlue()); } for (int i = 0; i < code.length(); i++) { switch (code.charAt(i)) { case 'a': case 'A': bytes[index] = (byte) a; break; case 'r': case 'R': bytes[index] = (byte) r; break; case 'g': case 'G': bytes[index] = (byte) g; break; case 'b': case 'B': bytes[index] = (byte) b; break; default: System.err.println(ImageUtilities.class.getClass() + ": Invalid code in '" + code + "'"); //$NON-NLS-1$ //$NON-NLS-2$ break; } index++; } } for (int i = 0; i < (width % pad); i++) { bytes[index] = 0; index++; } } return bytes; } }