/*
(c) 2012 Christopher Sloetjes
www.clamcompression.com
REVISED BY ZYNASIS! still garbage quality code, but quite a bit faster.
*/
package genetic.demo;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.image.BufferedImage;
import java.io.Serializable;
public class CompressedImage implements Serializable {
private static final long serialVersionUID = 1L;
public Triangle [] triangle=null;
final BufferedImage image;
int[][] imageData;
public CompressedImage (BufferedImage image, int geneCount) {
this.image=image;
imageData = loadData(image);
triangle = new Triangle [geneCount];
for (int i=0;i<geneCount;i++) {
triangle[i] = new Triangle ();
triangle[i].randomize();
}
}
public int[][] loadData(BufferedImage image) {
int[][] imageData = new int[256][256];
for (int x=0;x<256;x++) {
for (int y=0;y<256;y++) {
imageData[x][y] = image.getRGB(x, y);
}
}
return imageData;
}
public BufferedImage render () {
BufferedImage result = new BufferedImage (256,256,BufferedImage.TYPE_INT_RGB);
Graphics g = result.getGraphics();
for (int i=0;i<triangle.length;i++) {
Polygon p = new Polygon (triangle[i].x,triangle[i].y, 3);
g.setColor(new Color(triangle[i].c[0],triangle[i].c[1],triangle[i].c[2]));
g.fillPolygon(p);
}
return result;
}
public int calculateFitness (BufferedImage img) {
int result = 0;
for (int x=0;x<256;x++) {
for (int y=0;y<256;y++)
{
int c = imageData[x][y];
int c2 = img.getRGB(x, y);
int cred = (c >> 16) & 0x000000FF;
int cgreen = (c >>8 ) & 0x000000FF;
int cblue = (c) & 0x000000FF;
int c2red = (c2 >> 16) & 0x000000FF;
int c2green = (c2 >>8 ) & 0x000000FF;
int c2blue = (c2) & 0x000000FF;
result+=Math.abs(cred-c2red);
result+=Math.abs(cgreen-c2green);
result+=Math.abs(cblue-c2blue);
}
}
return result;
}
Triangle t = null;
public boolean mutate () {
t = triangle[(Triangle.random.nextInt(triangle.length))];
return t.mutate();
}
public void revert () {
t.revert();
}
}