content: package aliview.phenotype2genotype;
  
  
  import java.awt.Color;
  import java.awt.image.BufferedImage;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  
  import javax.imageio.ImageIO;
  import javax.imageio.ImageReader;
  import javax.imageio.stream.ImageInputStream;
  
  import org.apache.commons.io.FileUtils;
  import org.apache.log4j.Logger;
  
  import aliview.AminoAcid;
  
  public class Image2AscII {
  	private static final Logger logger = Logger.getLogger(Image2AscII.class);
  
  	private static Color[] aminoAcidBackgroundColor;
  	private static final String LF = System.getProperty("line.separator");
  
  	static{
  
  		aminoAcidBackgroundColor = new Color[255];
  		aminoAcidBackgroundColor[(byte)'A'] = new Color(0x276eb7);
  		aminoAcidBackgroundColor[(byte)'C'] = new Color(0xe68080);
  		aminoAcidBackgroundColor[(byte)'D'] = new Color(0xcc4dcc);
  		aminoAcidBackgroundColor[(byte)'E'] = new Color(0x984097);
  		aminoAcidBackgroundColor[(byte)'F'] = new Color(0x1980e6);
  		aminoAcidBackgroundColor[(byte)'G'] = new Color(0xe6994d);
  		aminoAcidBackgroundColor[(byte)'H'] = new Color(0x19b3b3);
  		aminoAcidBackgroundColor[(byte)'I'] = new Color(0x4ea0f3);
  		aminoAcidBackgroundColor[(byte)'K'] = new Color(0xe63319);
  		aminoAcidBackgroundColor[(byte)'L'] = new Color(0x78a6d5);
  		aminoAcidBackgroundColor[(byte)'M'] = new Color(0x0f549b);
  		aminoAcidBackgroundColor[(byte)'N'] = new Color(0x19cc19);
  		aminoAcidBackgroundColor[(byte)'P'] = new Color(0xcccc00);
  		aminoAcidBackgroundColor[(byte)'Q'] = new Color(0x5ced5c);
  		aminoAcidBackgroundColor[(byte)'R'] = new Color(0xf6442c);
  		aminoAcidBackgroundColor[(byte)'S'] = new Color(0x029602);
  		aminoAcidBackgroundColor[(byte)'T'] = new Color(0x45c945);
  		aminoAcidBackgroundColor[(byte)'V'] = new Color(0x047df9);
  		aminoAcidBackgroundColor[(byte)'W'] = new Color(0x0355a9);
  		aminoAcidBackgroundColor[(byte)'Y'] = new Color(0x14c6c8);
  		aminoAcidBackgroundColor[(byte)'x'] = Color.DARK_GRAY;
  		aminoAcidBackgroundColor[(byte)'-'] = new Color(230,230,230);
  		//	aminoAcidBackgroundColor[AminoAcid'GAP'] = Color'white;
  		//	aminoAcidBackgroundColor[(byte)'?'] = Color.white;
  
  		/*
  			aminoAcidBackgroundColor = new Color[255];
  			aminoAcidBackgroundColor[(byte)'A'] = new Color(0x276eb7);
  			aminoAcidBackgroundColor[(byte)'C'] = new Color(0xe68080);
  			aminoAcidBackgroundColor[(byte)'D'] = new Color(0xcc4dcc);
  			aminoAcidBackgroundColor[(byte)'E'] = new Color(0x984097);
  			aminoAcidBackgroundColor[(byte)'F'] = new Color(0x1980e6);
  			aminoAcidBackgroundColor[(byte)'G'] = new Color(0xe6994d);
  			aminoAcidBackgroundColor[(byte)'H'] = new Color(0x19b3b3);
  			aminoAcidBackgroundColor[(byte)'I'] = new Color(0x4ea0f3);
  			aminoAcidBackgroundColor[(byte)'K'] = new Color(0xe63319);
  			aminoAcidBackgroundColor[(byte)'L'] = new Color(0x78a6d5);
  			aminoAcidBackgroundColor[(byte)'M'] = new Color(0x0f549b);
  			aminoAcidBackgroundColor[(byte)'N'] = new Color(0x19cc19);
  			aminoAcidBackgroundColor[(byte)'P'] = new Color(0xcccc00);
  			aminoAcidBackgroundColor[(byte)'Q'] = new Color(0x5ced5c);
  			aminoAcidBackgroundColor[(byte)'R'] = new Color(0xf6442c);
  			aminoAcidBackgroundColor[(byte)'S'] = new Color(0x029602);
  			aminoAcidBackgroundColor[(byte)'T'] = new Color(0x45c945);
  			aminoAcidBackgroundColor[(byte)'V'] = new Color(0x047df9);
  			aminoAcidBackgroundColor[(byte)'W'] = new Color(0x0355a9);
  			aminoAcidBackgroundColor[(byte)'Y'] = new Color(0x14c6c8);
  		//	aminoAcidBackgroundColor[(byte)'x'] = Color.DARK_GRAY;
  //			aminoAcidBackgroundColor[(byte)'-'] = new Color(230,230,230);
  			//aminoAcidBackgroundColor[AminoAcid'GAP'] = Color'white;
  			aminoAcidBackgroundColor[(byte)'?'] = Color.white;
  		 */
  	}
  
  	public static void main(String[] args) {
  
  		//	ImageToAscII.createAscFile(new File("/home/anders/bilder/nude_protein.png"), new File("/home/anders/bilder/nude_protein.fasta"));
  		//ImageToAscII.createAscFile(new File("/home/anders/bilder/anders/anders_0795_v5_rot_crop_800.png"), new File("/home/anders/bilder/anders/anders_0795_v5_rot_crop_800.png.fasta"));
  		//ImageToAscII.createAscFile(new File("/home/anders/bilder/allison_cat/IMG_1850_low_col2.png"), new File("/home/anders/bilder/allison_cat/IMG_1850_low_col2.fasta"));
  		try {
  			Image2AscII.createAscFile(new File("/home/anders/projekt/image2asc/IMG_1850.jpeg"), new File("/home/anders/projekt/image2asc/IMG_1850.fasta"));
  		} catch (IOException e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  
  	}
  
  	public static void createAscFile(File imageFile, File outputFile) throws IOException{
  
  		BufferedImage image = Image2AscII.readImage(imageFile);
  		StringBuilder output = new StringBuilder();
  
  		output.append(">protein" + LF + "QQXX" + LF);
  
  		for(int y = 0; y < image.getHeight(); y++){
  			output.append(">Seq_" + y + LF);
  			for(int x = 0; x < image.getWidth(); x++){
  				int rgb = image.getRGB(x,y);
  
  				//						Color closeCol = getClosestColor(new Color(rgb));
  				//						char charVal = getByteFromRGBColor(closeCol);
  
  				char charVal = getAminoAcidFromColor(rgb);
  
  				output.append(charVal);
  			}
  			output.append(LF);
  		}
  
  
  		FileUtils.writeStringToFile(outputFile, output.toString());
  
  	}
  
  	private static char getByteFromRGBColor(Color inColor){
  		for(int n = 0; n < aminoAcidBackgroundColor.length; n++){
  			Color col = aminoAcidBackgroundColor[n];
  			if(col != null){
  				if(col.equals(inColor)){
  					return (char) n;
  				}
  			}
  		}
  		return '.';
  	}
  
  
  	public static BufferedImage readImage(File imageFile) throws IOException{
  		FileInputStream in = new FileInputStream(imageFile);
  		ImageInputStream iin = ImageIO.createImageInputStream(in);
  		ImageReader reader = ImageIO.getImageReaders(iin).next();
  		reader.setInput(iin, true, true);
  		BufferedImage image = reader.read(0);
  		return image;
  	}
  
  	public static char getAminoAcidFromColor(int rgbColor){
  
  		int maxVal = Color.green.getRGB();
  		//	logger.info(new Color(254,254,254).getRGB());
  
  		//	logger.info("maxVal" + maxVal);
  		int numberOfAA = AminoAcid.GROUP_ALL.length - 1;
  
  		int fraction = (maxVal/numberOfAA);
  		//	logger.info("fraction" + fraction);
  
  		int aaVal = (rgbColor / fraction);
  
  
  		return AminoAcid.GROUP_ALL[aaVal].getCodeCharVal();
  
  
  	}
  
  
  	public static Color getClosestColor(Color target){
  
  		//Color[] constantColors = new Color[] { Color.black, Color.blue, Color.cyan, Color.darkGray, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.white, Color.yellow };
  		Color nearestColor = null;
  		double nearestDistance = Double.MAX_VALUE;
  
  		for(int n = 0; n < aminoAcidBackgroundColor.length; n++){
  			Color constantColor = aminoAcidBackgroundColor[n];
  			if(constantColor != null){
  
  				//			logger.info("compare " + target + " with " + constantColor );
  
  				double testDistance = Math.pow(target.getRed() - constantColor.getRed(), 2) + 
  						Math.pow(target.getGreen() - constantColor.getGreen(), 2) +
  						Math.pow(target.getBlue() - constantColor.getBlue(), 2);
  
  
  				if(testDistance < nearestDistance){
  					nearestDistance = testDistance;
  					//				    	logger.info("new closest " + constantColor + " old " + nearestColor );
  					nearestColor = constantColor;
  				}
  			}
  		}
  		//			logger.info("result nearest " + nearestColor + " target " + target );
  		return nearestColor;
  	}
  
  }
  