Boa tarde pessoal, estou precisando cortar umas imagens para torna-las todas do mesmo tamanho para então subtrai-las. Eu obtive a localização de um pixels no centro da imagem e gostaria de corta-la a partir dessas coordenadas. Tentei usar o método getSubImagem(); mas este método está me cortando a imagem do centro para baixo e para o lado, fazendo assim com que a localização do meu ponto fique no canto superior, eu preciso cortar a imagem nas laterais fazendo ela se adequar a um tamanho partindo desse ponto fazendo com que ele fique exatamente no centro da imagem, alguém poderia me ajudar a fazer isso?
[Resolvido]Cortar imagem a partir de um ponto no centro
7 Respostas
Tio, um lápis e papel não ajudaria um pouco? Não é nem regra de três. É uma simples soma e subtração.
Eu recomendaria usar um papel milimetrado, só para lhe ajudar com as contas que você tem de fazer.
Não sei como é o seu sistema de coordenadas, mas normalmente, quando você quer algo como isso, você precisa usar algo como "posição inicial = -altura/2, -largura/2 " ou coisa parecida.
Tio, um lápis e papel não ajudaria um pouco? Não é nem regra de três. É uma simples soma e subtração.
Eu recomendaria usar um papel milimetrado, só para lhe ajudar com as contas que você tem de fazer.
Não sei como é o seu sistema de coordenadas, mas normalmente, quando você quer algo como isso, você precisa usar algo como "posição inicial = -altura/2, -largura/2 " ou coisa parecida.
Ah, tio agora entendi o que vc quiz dizer. Então vamos ao detalhe que dificulta a coisa.
SE fosse TODAS as imagens do mesmo tamanho obter o ponto central seria moleza, mas elas são de tamanho diferente logo se eu fizer o que recomendaste o ponto central delas ficaram diferente e ai não poderei fazer a subtração da imagem. O que preciso é exatamente redefinir essa imagem atravez de um ponto em comum em todas, ou seja o pixel que eu mencionei. Compreende?
Olhe só o seu problema - você está com dificuldades de definir os termos adequadamente. E é por isso que eu, que mandei minha bola de cristal faz alguns anos para a assistência técnica mas não tive nenhuma previsão de tempo para conserto, tenho de me virar com o que você nos diz.
Você disse “centro” mas na verdade você quer dizer “um ponto de referência, a partir do qual posso pegar minhas imagens”.
Pelo que você disse, você quer só macetear um jogo 2D em que as imagens são conhecidas e que de uma tela para outra a diferença é da movimentação de cenário e de alguns elementos que foram removidos ou adicionados.
Nesse caso, você pode tentar localizar uma determinada imagem que seja mais ou menos imutável entre frames, e então tentar localizá-la na tela. Mesmo isso não é tão trivial quanto parece 
No caso de uma imagem feita por um jogo, é até trivial achar um canto desconhecido. Ele pode fazer por template matching:
Fica fácil pois os tons de cor serão exatamente os mesmos e não há problemas como iluminação, rotação ou escala…
Foi assim que fiz o meu bot que joga bejeweled (ele jogava direto do site da popcap).
Olhe só o seu problema - você está com dificuldades de definir os termos adequadamente. E é por isso que eu, que mandei minha bola de cristal faz alguns anos para a assistência técnica mas não tive nenhuma previsão de tempo para conserto, tenho de me virar com o que você nos diz.Você disse “centro” mas na verdade você quer dizer “um ponto de referência, a partir do qual posso pegar minhas imagens”.
Pelo que você disse, você quer só macetear um jogo 2D em que as imagens são conhecidas e que de uma tela para outra a diferença é da movimentação de cenário e de alguns elementos que foram removidos ou adicionados.
Nesse caso, você pode tentar localizar uma determinada imagem que seja mais ou menos imutável entre frames, e então tentar localizá-la na tela. Mesmo isso não é tão trivial quanto parece
Não vejo nenhuma dificuldade de se compreender o que eu disse acima. Mas jogo que segue.
O jogo mencionado, na verdade o frame é imutável, o único problema que a pessoa que vai tirar os printes pode nem sempre tira-los do mesmo tamanho, e se eu o obrigar a fazer isso se torna muito desinteressante, visto que ganha-se mais tempo se a aplicação for automatizada.
Valeu ViniGodoy vou ler esse conteúdo e ver o que consigo arranjar.
No caso de uma imagem feita por um jogo, é até trivial achar um canto desconhecido. Ele pode fazer por template matching:
Fica fácil pois os tons de cor serão exatamente os mesmos e não há problemas como iluminação, rotação ou escala…
Foi assim que fiz o meu bot que joga bejeweled (ele jogava direto do site da popcap).
O ponto em si já está encontrado, o difícil está sendo redefinir o tamanho da imagem a partir dele.
Depois de mais de 12h seguidas tentando, depois de perder anos de vida com o stress. Consegui definir um padrão para manter as imagens do mesmo tamanho.
O padrão foi estabelecido por um pixel único nos 4 cantos da tela.
Segue o codigo.
int x = 0;
int y = 0;
int altura = 1;
int largura = 1;
File f = new File("src/11.png");
BufferedImage imagem = ImageIO.read(f);
@SuppressWarnings("unused")
Raster raster1 = imagem.getRaster();
WritableRaster raster2 = imagem.getRaster();
int[] pixel = new int[3];
int[] cor2 = new int[] { 166, 210, 255 };
int increment = 0;
ColorModel model = ColorModel.getRGBdefault();
for (int h = 0; h < imagem.getHeight(); h++)
for (int w = 0; w < imagem.getWidth(); w++) {
int rgb = imagem.getRGB(w, h);
int r = model.getRed(rgb);
int g = model.getGreen(rgb);
int b = model.getBlue(rgb);
if (r >= 35 && r <= 60 && g < 110) {
imagem.setRGB(w, h, -13883097);
}
if (r == 229 && g == 224 && b == 216) {
increment++;
if (increment == 1){
x = w;
y = h;
}
if (increment == 2){
largura = w - x;
}
if (increment == 5){
altura = h - y;
}
BufferedImage img1 = imagem.getSubimage(x, y, largura, altura);
ImageIO.write(img1, "PNG", new File("src/final8.png"));
}
}