Java/2D Graphics GUI/Color Model
Содержание
Checking for Color Models
<source lang="java"> import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import javax.swing.JFrame; public class GraphicsInfo extends JFrame {
private void printModelType(ColorModel cm) { if (cm instanceof DirectColorModel) { System.out.println("DirectColorModel"); } else if (cm instanceof IndexColorModel) { System.out.println("IndexColorModel"); } else { System.out.println("Unknown ColorModel"); } } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; GraphicsConfiguration gc = g2d.getDeviceConfiguration(); printModelType(gc.getColorModel()); BufferedImage bi = new BufferedImage(20, 20, BufferedImage.TYPE_BYTE_INDEXED); Graphics2D g2d2 = bi.createGraphics(); GraphicsConfiguration gc2 = g2d2.getDeviceConfiguration(); printModelType(gc2.getColorModel()); bi = new BufferedImage(20, 20, BufferedImage.TYPE_INT_ARGB); g2d2 = bi.createGraphics(); gc2 = g2d2.getDeviceConfiguration(); printModelType(gc2.getColorModel()); bi = new BufferedImage(20, 20, BufferedImage.TYPE_USHORT_565_RGB); g2d2 = bi.createGraphics(); gc2 = g2d2.getDeviceConfiguration(); printModelType(gc2.getColorModel()); } public static void main(String args[]) { Frame f = new GraphicsInfo(); f.setTitle("GraphicsInfo"); f.setSize(300, 250); f.show(); }
}
</source>
Color Composite
<source lang="java"> import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class ColorComposite extends JFrame {
MyCanvas canvas; JTextField textField; float alphaValue = 0.65f; public ColorComposite() { super(); Container container = getContentPane(); canvas = new MyCanvas(); container.add(canvas); JPanel panel = new JPanel(); JLabel label = new JLabel("Color-Composite: "); JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 65); slider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { JSlider tempSlider = (JSlider) e.getSource(); alphaValue = (float) (tempSlider.getValue() / 100.0); textField.setText(Float.toString(alphaValue)); canvas.repaint(); } }); textField = new JTextField("0.65", 4); panel.add(label); panel.add(slider); panel.add(textField); container.add(BorderLayout.SOUTH, panel); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setSize(450,450); setVisible(true); } public static void main(String arg[]) { new ColorComposite(); } class MyCanvas extends JLabel { Rectangle2D rec1, rec2, rec3, rec4, rec5; MyCanvas() { rec1 = new Rectangle2D.Float(25, 25, 75, 150); rec2 = new Rectangle2D.Float(125, 25, 100, 75); rec3 = new Rectangle2D.Float(75, 125, 125, 75); rec4 = new Rectangle2D.Float(225, 125, 125, 75); rec5 = new Rectangle2D.Float(150, 50, 125, 175); setBackground(Color.white); setSize(400, 225); } public void paint(Graphics g) { Graphics2D g2D = (Graphics2D) g; AlphaComposite ac = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alphaValue); g2D.setComposite(ac); g2D.setStroke(new BasicStroke(5.0f)); g2D.draw(rec1); GradientPaint gp = new GradientPaint(125f, 25f, Color.yellow, 225f, 100f, Color.blue); g2D.setPaint(gp); g2D.fill(rec2); BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); Graphics2D big = bi.createGraphics(); big.setColor(Color.magenta); big.fillRect(0, 0, 5, 5); big.setColor(Color.black); big.drawLine(0, 0, 5, 5); Rectangle r = new Rectangle(0, 0, 5, 5); TexturePaint tp = new TexturePaint(bi, r); g2D.setPaint(tp); g2D.fill(rec3); g2D.setColor(Color.green); g2D.fill(rec4); g2D.setColor(Color.red); g2D.fill(rec5); } }
}
</source>
Color model demo
<source lang="java"> import java.awt.Color; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.ColorModel; import java.awt.image.ruponentColorModel; import java.awt.image.DataBuffer; public class ComponentTest {
public static void main(String[] args) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); ColorModel cm = new ComponentColorModel(cs, new int[] { 5, 6, 5 }, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); Color fifty = new Color(cs, new float[] { 1.0f, 1.0f, 1.0f }, 0); float[] components = fifty.getComponents(null); System.out.print("Original normalized components: "); for (int i = 0; i < 3; i++) System.out.print(components[i] + " "); System.out.println(); int[] unnormalized = cm.getUnnormalizedComponents(components, 0, null, 0); System.out.print("Original unnormalized components: "); for (int i = 0; i < 3; i++) System.out.print(unnormalized[i] + " "); System.out.println(); Object pixel = cm.getDataElements(unnormalized, 0, (Object) null); System.out.print("Pixel samples: "); byte[] pixelBytes = (byte[]) pixel; for (int i = 0; i < 3; i++) System.out.print(pixelBytes[i] + " "); System.out.println(); unnormalized = cm.getComponents(pixel, null, 0); System.out.print("Derived unnormalized components: "); for (int i = 0; i < 3; i++) System.out.print(unnormalized[i] + " "); System.out.println(); components = cm.getNormalizedComponents(unnormalized, 0, null, 0); System.out.print("Derived normalized components: "); for (int i = 0; i < 3; i++) System.out.print(components[i] + " "); System.out.println(); }
}
</source>
Color Schema Generator
<source lang="java"> /*
* To change this template, choose Tools | Templates * and open the template in the editor. */
// Revised from jaspersoft ireport designer import java.awt.Color; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /**
* * @author gtoffoli */
public class ColorSchemaGenerator {
public final static String SCHEMA_DEFAULT = "default"; public final static String SCHEMA_PASTEL = "pastel"; public final static String SCHEMA_SOFT = "soft"; public final static String SCHEMA_HARD = "hard"; public final static String SCHEMA_LIGHT = "light"; public final static String SCHEMA_PALE = "pale"; private static float[] schema_default = new float[]{ -1f,-1f, 1f,-0.7f, 0.25f,1f, 0.5f,1f }; private static float[] schema_pastel = new float[]{ 0.5f,-0.9f, 0.5f,0.5f, 0.1f,0.9f, 0.75f,0.75f }; private static float[] schema_soft = new float[]{ 0.3f,-0.8f, 0.3f,0.5f, 0.1f,0.9f, 0.5f,0.75f }; private static float[] schema_hard = new float[]{ 1f,-1f, 1f,-0.6f, 0.1f,1f, 0.6f,1f }; private static float[] schema_light = new float[]{ 0.25f,1f, 0.5f,0.75f, 0.1f,1f, 0.5f,1f }; private static float[] schema_pale = new float[]{ 0.1f,-0.85f, 0.1f,0.5f, 0.1f,1f, 0.1f,0.75f }; private static java.util.Map<String, float[]> schemas = new HashMap<String, float[]>(); static { schemas.put(SCHEMA_DEFAULT, schema_default); schemas.put(SCHEMA_PASTEL, schema_pastel); schemas.put(SCHEMA_SOFT, schema_soft); schemas.put(SCHEMA_HARD, schema_hard); schemas.put(SCHEMA_LIGHT, schema_light); schemas.put(SCHEMA_PALE, schema_pale); } /** * Create the schema color. * * @param base * @param i (a color between 0 and 3) * @param schemaName * @return */ public static Color createColor(Color base, int i, String schemaName) { i = Math.abs(i %= 3); if (schemaName == null) schemaName = SCHEMA_SOFT; float[] schema = schemas.get(schemaName); float[] components = Color.RGBtoHSB(base.getRed(), base.getGreen(), base.getBlue(), null); components[1] = (schema[i*2] < 0) ? -schema[i*2] * components[1] : schema[i*2]; if (components[1] > 1) components[1] = 1.0f; if (components[1] < 0) components[1] = 0; components[2] = (schema[i*2+1] < 0) ? -schema[i*2+1] * components[2] : schema[i*2+1]; if (components[2] > 1) components[2] = 1.0f; if (components[2] < 0) components[2] = 0; return new Color( Color.HSBtoRGB(components[0], components[1], components[2])); } public static List<String> getColors() { if (colorsList == null) { colorsList = new ArrayList<String>(); colorsMap = new HashMap<String,String>(); for (int i=0; i<colors.length/2; ++i) { colorsList.add( colors[i*2] ); colorsMap.put(colors[i*2], colors[(i*2)+1]); } } return colorsList; } public static Color getColor(String name) { if (colorsMap == null) { getColors(); } String rgb = colorsMap.get(name); return decodeColor("#"+rgb); } public static java.awt.Color decodeColor(String colorString) { java.awt.Color color = null; char firstChar = colorString.charAt(0); if (firstChar == "#") { color = new java.awt.Color(Integer.parseInt(colorString.substring(1), 16)); } else if ("0" <= firstChar && firstChar <= "9") { color = new java.awt.Color(Integer.parseInt(colorString)); } else { color = java.awt.Color.black; } return color; } static private List<String> colorsList = null; static private HashMap<String, String> colorsMap = null; static private String[] colors = new String[]{ "Aliceblue","F0F8FF", "Antiquewhite","FAEBD7", "Aqua","00FFFF", "Aquamarine","7FFFD4", "Azure","F0FFFF", "Beige","F5F5DC", "Bisque","FFE4C4", "Black","000000", "Blanchedalmond","FFEBCD", "Blue","0000FF", "Blueviolet","8A2BE2", "Brown","A52A2A", "Burlywood","DEB887", "Cadetblue","5F9EA0", "Chartreuse","7FFF00", "Chocolate","D2691E", "Coral","FF7F50", "Cornflowerblue","6495ED", "Cornsilk","FFF8DC", "Crimson","DC143C", "Cyan","00FFFF", "Darkblue","00008B", "Darkcyan","008B8B", "Darkgoldenrod","B8860B", "Darkgray","A9A9A9", "Darkgreen","006400", "Darkkhaki","BDB76B", "Darkmagenta","8B008B", "Darkolivegreen","556B2F", "Darkorange","FF8C00", "Darkorchid","9932CC", "Darkred","8B0000", "Darksalmon","E9967A", "Darkseagreen","8FBC8F", "Darkslateblue","483D8B", "Darkturqoise","00CED1", "Darkslategray","2F4F4F", "Darkviolet","9400D3", "Deeppink","FF1493", "Deepskyblue","00BFFF", "Dimgray","696969", "Dodgerblue","1E90FF", "Firebrick","B22222", "Floralwhite","FFFAF0", "Forestgreen","228B22", "Fuchsia","FF00FF", "Gainsboro","DCDCDC", "Ghostwhite","F8F8FF", "Gold","FFD700", "Goldenrod","DAA520", "Gray","808080", "Green","008000", "Greenyellow","ADFF2F", "Honeydew","F0FFF0", "Hotpink","FF69B4", "Indianred","CD5C5C", "Indigo","4B0082", "Ivory","FFFFF0", "Khaki","F0E68C", "Lavender","E6E6FA", "Lavenderblush","FFF0F5", "Lawngreen","7CFC00", "Lemonchiffon","FFFACD", "Lightblue","ADD8E6", "Lightcoral","F08080", "Lightcyan","E0FFFF", "Lightgoldenrodyellow","FAFAD2", "Lightgreen","90EE90", "Lightgrey","D3D3D3", "Lightpink","FFB6C1", "Lightsalmon","FFA07A", "Lightseagreen","20B2AA", "Lightskyblue","87CEFA", "Lightslategray","778899", "Lisghtsteelblue","B0C4DE", "Lightyellow","FFFFE0", "Lime","00FF00", "Limegreen","32CD32", "Linen","FAF0E6", "Magenta","FF00FF", "Maroon","800000", "Mediumaquamarine","66CDAA", "Mediumblue","0000CD", "Mediumorchid","BA55D3", "Mediumpurple","9370DB", "Mediumseagreen","3CB371", "Mediumslateblue","7B68EE", "Mediumspringgreen","00FA9A", "Mediumturquoise","48D1CC", "Mediumvioletred","C71585", "Midnightblue","191970", "Mintcream","F5FFFA", "Mistyrose","FFE4E1", "Moccasin","FFE4B5", "Navajowhite","FFDEAD", "Navy","000080", "Navyblue","9FAFDF", "Oldlace","FDF5E6", "Olive","808000", "Olivedrab","6B8E23", "Orange","FFA500", "Orangered","FF4500", "Orchid","DA70D6", "Palegoldenrod","EEE8AA", "Palegreen","98FB98", "Paleturquoise","AFEEEE", "Palevioletred","DB7093", "Papayawhip","FFEFD5", "Peachpuff","FFDAB9", "Peru","CD853F", "Pink","FFC0CB", "Plum","DDA0DD", "Powderblue","B0E0E6", "Purple","800080", "Red","FF0000", "Rosybrown","BC8F8F", "Royalblue","4169E1", "Saddlebrown","8B4513", "Salmon","FA8072", "Sandybrown","F4A460", "Seagreen","2E8B57", "Seashell","FFF5EE", "Sienna","A0522D", "Silver","C0C0C0", "Skyblue","87CEEB", "Slateblue","6A5ACD", "Snow","FFFAFA", "Springgreen","00FF7F", "Steelblue","4682B4", "Tan","D2B48C", "Teal","008080", "Thistle","D8BFD8", "Tomato","FF6347", "Turquoise","40E0D0", "Violet","EE82EE", "Wheat","F5DEB3", "White","FFFFFF", "Whitesmoke","F5F5F5", "Yellow","FFFF00", "Yellowgreen","9ACD32"};
}
</source>
Convert HSB to RGB value
<source lang="java">
import java.awt.Color; public class Main {
public static void main() { float hue = 12; float saturation = 13; float brightness = 14; int rgb = Color.HSBtoRGB(hue, saturation, brightness); int red = (rgb >> 16) & 0xFF; int green = (rgb >> 8) & 0xFF; int blue = rgb & 0xFF; }
}
</source>
Convert RGB to HSB
<source lang="java"> import java.awt.Color; public class Main {
public static void main() { int red = 23; int green = 66; int blue = 99; float[] hsb = Color.RGBtoHSB(red, green, blue, null); float hue = hsb[0]; float saturation = hsb[1]; float brightness = hsb[2]; }
}
</source>
Image Color Effect: Brightness, Contrast, Negative
<source lang="java"> import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.MediaTracker; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.awt.image.ByteLookupTable; import java.awt.image.LookupOp; import java.awt.image.LookupTable; import java.awt.image.ShortLookupTable; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.TitledBorder; public class ColorApp extends JFrame {
DisplayPanel displayPanel; JButton brightenButton, darkenButton, contrastIncButton, contrastDecButton, reverseButton, resetButton; public ColorApp() { super(); Container container = getContentPane(); displayPanel = new DisplayPanel(); container.add(displayPanel); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(3, 2)); panel .setBorder(new TitledBorder( "Click a Button to Perform the Associated Operation and Reset...")); brightenButton = new JButton("Brightness >>"); brightenButton.addActionListener(new ButtonListener()); darkenButton = new JButton("Darkness >>"); darkenButton.addActionListener(new ButtonListener()); contrastIncButton = new JButton("Contrast >>"); contrastIncButton.addActionListener(new ButtonListener()); contrastDecButton = new JButton("Contrast <<"); contrastDecButton.addActionListener(new ButtonListener()); reverseButton = new JButton("Negative"); reverseButton.addActionListener(new ButtonListener()); resetButton = new JButton("Reset"); resetButton.addActionListener(new ButtonListener()); panel.add(brightenButton); panel.add(darkenButton); panel.add(contrastIncButton); panel.add(contrastDecButton); panel.add(reverseButton); panel.add(resetButton); container.add(BorderLayout.SOUTH, panel); addWindowListener(new WindowEventHandler()); setSize(displayPanel.getWidth(), displayPanel.getHeight() + 25); show(); } class WindowEventHandler extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String arg[]) { new ColorApp(); } class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); if (button.equals(brightenButton)) { displayPanel.brightenLUT(); displayPanel.applyFilter(); displayPanel.repaint(); } else if (button.equals(darkenButton)) { displayPanel.darkenLUT(); displayPanel.applyFilter(); displayPanel.repaint(); } else if (button.equals(contrastIncButton)) { displayPanel.contrastIncLUT(); displayPanel.applyFilter(); displayPanel.repaint(); } else if (button.equals(contrastDecButton)) { displayPanel.contrastDecLUT(); displayPanel.applyFilter(); displayPanel.repaint(); } else if (button.equals(reverseButton)) { displayPanel.reverseLUT(); displayPanel.applyFilter(); displayPanel.repaint(); } else if (button.equals(resetButton)) { displayPanel.reset(); displayPanel.repaint(); } } }
} class DisplayPanel extends JPanel {
Image displayImage; BufferedImage bi; Graphics2D big; LookupTable lookupTable; DisplayPanel() { setBackground(Color.black); // panel background color loadImage(); setSize(displayImage.getWidth(this), displayImage.getWidth(this)); // panel createBufferedImage(); } public void loadImage() { displayImage = Toolkit.getDefaultToolkit().getImage( "largejexpLogo.jpg"); MediaTracker mt = new MediaTracker(this); mt.addImage(displayImage, 1); try { mt.waitForAll(); } catch (Exception e) { System.out.println("Exception while loading."); } if (displayImage.getWidth(this) == -1) { System.out.println("No jpg file"); System.exit(0); } } public void createBufferedImage() { bi = new BufferedImage(displayImage.getWidth(this), displayImage .getHeight(this), BufferedImage.TYPE_INT_ARGB); big = bi.createGraphics(); big.drawImage(displayImage, 0, 0, this); } public void brightenLUT() { short brighten[] = new short[256]; for (int i = 0; i < 256; i++) { short pixelValue = (short) (i + 10); if (pixelValue > 255) pixelValue = 255; else if (pixelValue < 0) pixelValue = 0; brighten[i] = pixelValue; } lookupTable = new ShortLookupTable(0, brighten); } public void darkenLUT() { short brighten[] = new short[256]; for (int i = 0; i < 256; i++) { short pixelValue = (short) (i - 10); if (pixelValue > 255) pixelValue = 255; else if (pixelValue < 0) pixelValue = 0; brighten[i] = pixelValue; } lookupTable = new ShortLookupTable(0, brighten); } public void contrastIncLUT() { short brighten[] = new short[256]; for (int i = 0; i < 256; i++) { short pixelValue = (short) (i * 1.2); if (pixelValue > 255) pixelValue = 255; else if (pixelValue < 0) pixelValue = 0; brighten[i] = pixelValue; } lookupTable = new ShortLookupTable(0, brighten); } public void contrastDecLUT() { short brighten[] = new short[256]; for (int i = 0; i < 256; i++) { short pixelValue = (short) (i / 1.2); if (pixelValue > 255) pixelValue = 255; else if (pixelValue < 0) pixelValue = 0; brighten[i] = pixelValue; } lookupTable = new ShortLookupTable(0, brighten); } public void reverseLUT() { byte reverse[] = new byte[256]; for (int i = 0; i < 256; i++) { reverse[i] = (byte) (255 - i); } lookupTable = new ByteLookupTable(0, reverse); } public void reset() { big.setColor(Color.black); big.clearRect(0, 0, bi.getWidth(this), bi.getHeight(this)); big.drawImage(displayImage, 0, 0, this); } public void applyFilter() { LookupOp lop = new LookupOp(lookupTable, null); lop.filter(bi, bi); } public void update(Graphics g) { g.clearRect(0, 0, getWidth(), getHeight()); paintComponent(g); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; g2D.drawImage(bi, 0, 0, this); }
}
</source>
IndexColorModel
<source lang="java"> import java.awt.Color; import java.awt.image.ColorModel; import java.awt.image.IndexColorModel; public class IndexTest {
public static void main(String[] args) { byte ff = (byte) 0xff; byte[] r = { ff, 0, 0, ff, 0 }; byte[] g = { 0, ff, 0, ff, 0 }; byte[] b = { 0, 0, ff, ff, 0 }; ColorModel cm = new IndexColorModel(3, 5, r, g, b); Color[] colors = { new Color(255, 0, 0), new Color(0, 255, 0), new Color(0, 0, 255), new Color(64, 255, 64), new Color(255, 255, 0), new Color(0, 255, 255) }; for (int i = 0; i < colors.length; i++) { float[] normalizedComponents = colors[i].getComponents(null); int[] unnormalizedComponents = cm.getUnnormalizedComponents( normalizedComponents, 0, null, 0); int rgb = colors[i].getRGB(); Object pixel = cm.getDataElements(rgb, null); System.out.println(colors[i] + " -> " + ((byte[]) pixel)[0]); } for (byte i = 0; i < 5; i++) { int[] unnormalizedComponents = cm.getComponents(i, null, 0); System.out.print(i + " -> unnormalized components"); for (int j = 0; j < unnormalizedComponents.length; j++) System.out.print(" " + unnormalizedComponents[j]); System.out.println(); } }
}
</source>
RGB Gray Filter
<source lang="java"> /*
* Copyright (c) 2001-2009 JGoodies Karsten Lentzsch. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * o Neither the name of JGoodies Karsten Lentzsch nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
import java.awt.Image; import java.awt.image.*; import javax.swing.GrayFilter; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent;
/**
* An image filter that turns an icon into a grayscale icon. Used by* the JGoodies Windows and Plastic L&Fs to create a disabled icon.
*
* The high-resolution gray filter can be disabled globally using
* {@link Options#setHiResGrayFilterEnabled(boolean)}; it is enabled by default.
* The global setting can be overridden per component by setting
* the client property key {@link Options#HI_RES_DISABLED_ICON_CLIENT_KEY}
* to Boolean.FALSE
.<p>
*
* Thanks to Andrej Golovnin for suggesting a simpler filter formula.
*
* @author Karsten Lentzsch
* @version $Revision: 1.10 $
*/
public final class RGBGrayFilter extends RGBImageFilter {
/**
* Overrides default constructor; prevents instantiation.
*/
private RGBGrayFilter() {
canFilterIndexColorModel = true;
}
/**
* Returns an icon with a disabled appearance. This method is used
* to generate a disabled icon when one has not been specified.
*
* @param component the component that will display the icon, may be null.
* @param icon the icon to generate disabled icon from.
* @return disabled icon, or null if a suitable icon can not be generated.
*/
public static Icon getDisabledIcon(JComponent component, Icon icon) {
if ( (icon == null)
|| (component == null)
|| (icon.getIconWidth() == 0)
|| (icon.getIconHeight() == 0)) {
return null;
}
Image img;
if (icon instanceof ImageIcon) {
img = ((ImageIcon) icon).getImage();
} else {
img = new BufferedImage(
icon.getIconWidth(),
icon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
icon.paintIcon(component, img.getGraphics(), 0, 0);
}
ImageProducer producer =
new FilteredImageSource(img.getSource(), new RGBGrayFilter());
return new ImageIcon(component.createImage(producer));
}
/**
* Converts a single input pixel in the default RGB ColorModel to a single
* gray pixel.
*
* @param x the horizontal pixel coordinate
* @param y the vertical pixel coordinate
* @param rgb the integer pixel representation in the default RGB color model
* @return a gray pixel in the default RGB color model.
*
* @see ColorModel#getRGBdefault
* @see #filterRGBPixels
*/
public int filterRGB(int x, int y, int rgb) {
// Find the average of red, green, and blue.
float avg = (((rgb >> 16) & 0xff) / 255f +
((rgb >> 8) & 0xff) / 255f +
(rgb & 0xff) / 255f) / 3;
// Pull out the alpha channel.
float alpha = (((rgb >> 24) & 0xff) / 255f);
// Calculate the average.
// Sun"s formula: Math.min(1.0f, (1f - avg) / (100.0f / 35.0f) + avg);
// The following formula uses less operations and hence is faster.
avg = Math.min(1.0f, 0.35f + 0.65f * avg);
// Convert back into RGB.
return (int) (alpha * 255f) << 24 |
(int) (avg * 255f) << 16 |
(int) (avg * 255f) << 8 |
(int) (avg * 255f);
}
}
</source>