package pl.wroc.pwr.image.converter; import pl.wroc.pwr.IOperator; import pl.wroc.pwr.image.IHSVImage; import pl.wroc.pwr.image.IRGBImage; import pl.wroc.pwr.image.model.HSVImage; import pl.wroc.pwr.image.model.RGBImage; import pl.wroc.pwr.imagechannel.IImageChannel; public class HSVtoRGBConverter implements IOperator< IRGBImage > { /** * */ private static final long serialVersionUID = -399191030084052738L; private IHSVImage inputImage; public HSVtoRGBConverter(IImageChannel hue, IImageChannel saturation, IImageChannel value) { this.inputImage = new HSVImage(hue, saturation, value); } public HSVtoRGBConverter( IHSVImage image ) { this.inputImage = image; } public void setImage( IHSVImage image ) { this.inputImage = image; } public IRGBImage apply( ) { IRGBImage outputImage = new RGBImage( this.inputImage.getSize( ) ); for ( int i = 0; i < this.inputImage.getHueChannel( ).getMaxIndex( ); i++ ) { float saturation = this.inputImage.getSaturationChannel( ).getValue( i ); float hue = this.inputImage.getHueChannel( ).getValue( i ); float brightness = this.inputImage.getBrightnessChannel( ).getValue( i ); float red = 0; float green = 0; float blue = 0; if ( saturation == 0 ) { red = brightness; green = brightness; blue = brightness; } else { if ( hue == 1 ) { hue = 0; } hue = hue * 6; int iHue = ( int )hue; float fHue = hue - iHue; float p = brightness * ( 1 - saturation ); float q = brightness * ( 1 - ( saturation * fHue ) ); float t = brightness * ( 1 - ( saturation * ( 1 - fHue ) ) ); switch ( iHue ) { case 0: red = brightness; green = t; blue = p; break; case 1: red = q; green = brightness; blue = p; break; case 2: red = p; green = q; blue = brightness; break; case 3: red = p; green = q; blue = brightness; break; case 4: red = t; green = p; blue = brightness; break; case 5: red = brightness; green = p; blue = q; break; } } outputImage.getRedChannel( ).setValue( i, red ); outputImage.getGreenChannel( ).setValue( i, green ); outputImage.getBlueChannel( ).setValue( i, blue ); } return outputImage; } }