Correspondência entre coordenadas do ImageView e pixels de bitmap - Android
No meu aplicativo, eu quero que o usuário possa selecionar algum conteúdo de uma imagem contida em umImageView
.
Para selecionar o conteúdo, subclassei oImageView
classe tornando-se implementar oOnTouchListener
então desenhar sobre ele um retângulo com bordas decididas pelo usuário.
Aqui está um exemplo do resultado do desenho (para ter uma idéia de como funciona você pode pensar nisso como quando você clica com o mouse na sua área de trabalho e arrasta o mouse):
Agora eu preciso determinar qualpíxeis doBitmap
imagem correspondem à parte selecionada. É fácil determinar quais são os pontos doImageView
pertencente ao retângulo, mas não sei como obter os pixels correspondentes, já que oImageView
tem um formato diferente da imagem original.
Eu segui a abordagem descritaespecialmente aqui, mas também aqui, mas não estou totalmente satisfeito, porque na minha opinião a correspondência feita é 1 em 1 entre pixels e pontos noImageView
e não me dá todos os pixels correspondentes na imagem original para a área selecionada.
ChamandohoveredRect
o retângulo noImageView
os pontos dentro dele são:
class Point {
float x, y;
@Override
public String toString() {
return x + ", " + y;
}
}
Vector<Point> pointsInRect = new Vector<Point>();
for( int x = hoveredRect.left; x <= hoveredRect.right; x++ ){
for( int y = hoveredRect.top; y <= hoveredRect.bottom; y++ ){
Point pointInRect = new Point();
pointInRect.x = x;
pointInRect.y = y;
pointsInRect.add(pointInRect);
}
}
Como posso obter umaVector<Pixels> pixelsInImage
contendo os pixels correspondentes daBitmap
imagem?
EXPLICAÇÕES ADICIONADAS
Vou explicar um pouco melhor o contexto do meu problema:
Eu preciso fazer algum processamento de imagem na parte selecionada, e quero ter certeza de que todos os pixels no retângulo são processados.
O processamento da imagem será feito em um servidor, mas ele precisa saber exatamente quais pixels processar. Servidor funciona com imagem com dimensões reais, o aplicativo android apenas informa quais pixels processar para o servidor, passando um vetor contendo as coordenadas de pixel
E por que não gosto das soluções propostas nos links acima:
As respostas dadas transformam coordenadas com uma moda de 1 para 1. Essa abordagem claramente não é válida para minha tarefa, já que uma área de, digamos, 50 pontos noImageView
de um determinado tamanho na tela não pode corresponder a uma área do mesmo número de pixels na imagem real, mas deve considerar a proporção de aspecto diferente.
Como exemplo, esta é a área que deve ser selecionada se a imagem for menor que aImageView
mostrado no aplicativo: