Ниже рабочий код. Но работает очень медленно.
Что тут можно оптимизировать для ускорения работы?
Скан может быть 1368 на 768 точек
Образец для сравнения 20 на 20 точек
package comparator;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class RGBComparator
{
/**
* @param args
*/
public static void main(String[] args)
{
try
{
log("Start");
long time1 = System.currentTimeMillis();
BufferedImage img1 = ImageIO.read(new File("res/guild.png"));
BufferedImage img2 = ImageIO.read(new File("res/scan1.png"));
int[][][] rgb = new int[256][256][256];
int w1 = img1.getWidth();
int h1 = img1.getHeight();
for(int i=0;i<w1; i++)
{
for(int j=0; j<h1; j++)
{
int[] rgb1 = img1.getRaster().getPixel(i, j, new int[3]);
rgb[rgb1[0]][rgb1[1]][rgb1[2]] ++;
}
}
int w2 = img2.getWidth();
int h2 = img2.getHeight();
for(int x=0; x<(w2-w1)+1;x++)
{
for(int y=0;y<(h2-h1)+1;y++)
{
//log("...");
int errors = 0;
int[][][] c_rgb = copyRGB(rgb);
for(int i=0;i<w1; i++)
{
for(int j=0; j<h1; j++)
{
int[] rgb2 = img2.getRaster().getPixel((x+i), (y+j), new int[3]);
int v = c_rgb[rgb2[0]][rgb2[1]][rgb2[2]];
if( v == 0) { errors++; continue; }
c_rgb[rgb2[0]][rgb2[1]][rgb2[2]] --;
}
}
int zcounter=0;
int pcounter=0;
int mcounter=0;
for(int r=0;r<256;r++)
{
for(int g=0;g<256;g++)
{
for(int b=0;b<256;b++)
{
if(c_rgb[r][g][b]>0) pcounter++;
else if(c_rgb[r][g][b]<0) mcounter++;
else zcounter++;
}
}
}
if(pcounter < 10 && mcounter < 10)
{
log("For ["+x+","+y+"]");
log("errors= "+errors);
log("pcounter= "+pcounter);
log("zcounter= "+zcounter);
log("mcounter= "+mcounter);
}
}
}
long time2 = System.currentTimeMillis();
log("Finish");
log("ET(ms)= "+(time2-time1));
}
catch(Exception e)
{
e.printStackTrace();
}
}
private static int[][][] copyRGB(int[][][] rgb)
{
int[][][] res = new int[256][256][256];
for(int r=0;r<256;r++)
{
for(int g=0;g<256;g++)
{
for(int b=0;b<256;b++)
{
res[r][g][b] = rgb[r][g][b];
}
}
}
return res;
}
private static void log(String s)
{
System.out.println(s);
}
}