001/* 002 * BioJava development code 003 * 004 * This code may be freely distributed and modified under the 005 * terms of the GNU Lesser General Public Licence. This should 006 * be distributed with the code. If you do not have a copy, 007 * see: 008 * 009 * http://www.gnu.org/copyleft/lesser.html 010 * 011 * Copyright for this code is held jointly by the individual 012 * authors. These should be listed in @author doc comments. 013 * 014 * For more information on the BioJava project and its aims, 015 * or to join the biojava-l mailing list, visit the home page 016 * at: 017 * 018 * http://www.biojava.org/ 019 * 020 * Created on Aug 3, 2007 021 */ 022package org.biojava.nbio.structure.gui.util.color; 023 024import java.awt.*; 025import java.awt.color.ColorSpace; 026 027/** 028 * @author Spencer Bliven 029 * 030 */ 031public class HSVColorSpace extends ColorSpace { 032 033 private static final long serialVersionUID = 8324413992279510075L; 034 035 public static void main(String[] args) { 036 HSVColorSpace csHSV = new HSVColorSpace(); 037 ColorSpace csRGB = ColorSpace.getInstance(CS_sRGB); 038 Color c; 039 float[] rgbComp; 040 float[] hsvComp; 041 042 c = Color.RED; 043 rgbComp = c.getColorComponents(csRGB,null); 044 hsvComp = c.getColorComponents(csHSV, null); 045 assert(rgbComp.length == 3); 046 assert(hsvComp.length == 3); 047 System.out.format("RED\tRGB[%f %f %f] HSV[%f %f %f]\n", 048 rgbComp[0], rgbComp[1], rgbComp[2], 049 hsvComp[0], hsvComp[1], hsvComp[2] ); 050 051 052 c = Color.WHITE; 053 rgbComp = c.getColorComponents(csRGB,null); 054 hsvComp = c.getColorComponents(csHSV, null); 055 System.out.format("WHITE\tRGB[%f %f %f] HSV[%f %f %f]\n", 056 rgbComp[0], rgbComp[1], rgbComp[2], 057 hsvComp[0], hsvComp[1], hsvComp[2] ); 058 059 c = Color.BLACK; 060 rgbComp = c.getColorComponents(csRGB,null); 061 hsvComp = c.getColorComponents(csHSV, null); 062 System.out.format("BLACK\tRGB[%f %f %f] HSV[%f %f %f]\n", 063 rgbComp[0], rgbComp[1], rgbComp[2], 064 hsvComp[0], hsvComp[1], hsvComp[2] ); 065 066 c = Color.GRAY; 067 rgbComp = c.getColorComponents(csRGB,null); 068 hsvComp = c.getColorComponents(csHSV, null); 069 System.out.format("GRAY\tRGB[%f %f %f] HSV[%f %f %f]\n", 070 rgbComp[0], rgbComp[1], rgbComp[2], 071 hsvComp[0], hsvComp[1], hsvComp[2] ); 072 073 c = Color.CYAN; 074 rgbComp = c.getColorComponents(csRGB,null); 075 hsvComp = c.getColorComponents(csHSV, null); 076 System.out.format("CYAN\tRGB[%f %f %f] HSV[%f %f %f]\n", 077 rgbComp[0], rgbComp[1], rgbComp[2], 078 hsvComp[0], hsvComp[1], hsvComp[2] ); 079 080 081 } 082 /** 083 * @param type 084 * @param numcomponents 085 */ 086 public HSVColorSpace() { 087 super(ColorSpace.TYPE_HSV, 3); 088 } 089 090 /** 091 * @param ciexyzvalue The color components in CIEXYZ colorspace 092 * @return the equivalent HSV components 093 * @see java.awt.color.ColorSpace#fromCIEXYZ(float[]) 094 */ 095 @Override 096 public float[] fromCIEXYZ(float[] ciexyzvalue) { 097 ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ); 098 float[] rgb = CIEXYZcs.toRGB(ciexyzvalue); 099 return this.fromRGB(rgb); 100 } 101 102 /** 103 * @param rgbvalue 104 * @return 105 * @see java.awt.color.ColorSpace#fromRGB(float[]) 106 */ 107 @Override 108 public float[] fromRGB(float[] rgbvalue) { 109 assert(rgbvalue.length==3); 110 Color rgbColor = new Color(rgbvalue[0], rgbvalue[1], rgbvalue[2]); 111 return Color.RGBtoHSB(rgbColor.getRed(),rgbColor.getGreen(),rgbColor.getBlue(), null); 112 } 113 114 /** 115 * @param hsv 116 * @return 117 * @see java.awt.color.ColorSpace#toCIEXYZ(float[]) 118 */ 119 @Override 120 public float[] toCIEXYZ(float[] hsv) { 121 float[] rgb = this.toRGB(hsv); 122 ColorSpace CIEXYZcs = ColorSpace.getInstance(CS_CIEXYZ); 123 return CIEXYZcs.fromRGB(rgb); 124 } 125 126 /** 127 * @param hsv 3-component array specifying hue, saturation, value 128 * @return equivalent red,green,blue components 129 * @see java.awt.color.ColorSpace#toRGB(float[]) 130 */ 131 @Override 132 public float[] toRGB(float[] hsv) { 133 int rgb = Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]); 134 Color rgbColor = new Color(rgb); 135 return rgbColor.getColorComponents(null); 136 } 137 138 private static HSVColorSpace hsvSpace; 139 /** 140 * The HSV color space 141 */ 142 public static final int CS_HSV = 1007; 143 public static ColorSpace getInstance(int colorspace) { 144 ColorSpace theColorSpace; 145 switch( colorspace ) { 146 case CS_HSV: 147 synchronized(HSVColorSpace.class) { 148 if(hsvSpace == null) { 149 hsvSpace = new HSVColorSpace(); 150 } 151 theColorSpace = hsvSpace; 152 } 153 break; 154 default: 155 theColorSpace = ColorSpace.getInstance(colorspace); 156 } 157 158 return theColorSpace; 159 } 160 161 public static ColorSpace getHSVColorSpace() { 162 return HSVColorSpace.getInstance(CS_HSV); 163 } 164 165}