/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Flemming N. Larsen * - Initial implementation *******************************************************************************/ package net.sf.robocode.ui.gfx; import net.sf.robocode.io.Logger; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.FilteredImageSource; import java.awt.image.RGBImageFilter; import java.io.IOException; import java.net.URL; /** * Class used for utilizing images. * * @author Flemming N. Larsen (original) */ public class ImageUtil { /** * Returns an image resource. * * @param filename the filename of the image to load * @return the loaded image */ public static Image getImage(String filename) { URL url = ImageUtil.class.getResource(filename); if (url == null) { Logger.logError("Could not load image because of invalid filename: " + filename); return null; } try { final BufferedImage result = ImageIO.read(url); if (result == null) { final String message = "Could not load image: " + filename; Logger.logError(message); throw new Error(); } return result; } catch (IOException e) { Logger.logError("Could not load image: " + filename); return null; } } /** * Creates and returns a buffered version of the specified image. * * @param image the image to create a buffered image for * @return a buffered image based on the specified image */ public static BufferedImage getBufferedImage(Image image) { BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics g = bufferedImage.getGraphics(); g.drawImage(image, 0, 0, null); return bufferedImage; } /** * Create a copy of an robot image into a coloured robot image. The colors of the * input image are changed into the input color, but with the same lumination. * * @param img the source image * @param color the new color that substitutes the old color(s) in the source image * @return a new image */ public static Image createColouredRobotImage(Image img, Color color) { return (color == null) ? img : (img == null) ? null : Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(img.getSource(), new ColorFilter(color))); } /** * A color filter used for changing colors into another color. * * @author Flemming N. Larsen */ private static class ColorFilter extends RGBImageFilter { private final float[] hsl; public ColorFilter(Color color) { hsl = ColorUtil.fromRGBtoHSL(color.getRed(), color.getGreen(), color.getBlue()); } @Override public int filterRGB(int x, int y, int argb) { int r = (argb >> 16) & 0xff; int g = (argb >> 8) & 0xff; int b = argb & 0xff; float[] HSL = ColorUtil.fromRGBtoHSL(r, g, b); if (HSL[1] > 0) { float L = Math.min(1, (hsl[2] + HSL[2]) / 2 + hsl[2] / 7); return argb & 0xff000000 | ColorUtil.fromHSLtoRGB(hsl[0], hsl[1], L); } return argb; } } }