algoritmo de rotação de imagem
-
20-08-2019 - |
Pergunta
Eu estou procurando um algoritmo que gira uma imagem por alguns graus (entrada).
public Image rotateImage(Image image, int degrees)
(casos imagem poderia ser substituído por int [] contendo cada pixel valores RGB, Meu problema é que eu preciso para implementá-lo para um projeto JavaME MIDP 2.0 então eu devo usar executável código na JVM anteriores à versão 1.5 Alguém pode me ajudar com isso?
EDIT: eu esqueci de mencionar que eu não tenho APIs SVG disponível e que eu preciso de um método para girar pelo grau arbitrário outro de 90 - 180- 270
Além disso, nenhum java.awt. * pacotes estão disponíveis no MIDP 2.0
Solução
Uma das melhores páginas descrevendo rotação de imagem algoritmos que eu encontrei na internet está ligada a excelente leptonica biblioteca de Dan Bloomberg. Enquanto a própria biblioteca leptonica é escrito em C e não vai ajudar você, sua página na imagem algoritmos de rotação:
http://www.leptonica.org/rotation.html
é definitivamente vale a pena ler. Você provavelmente irá querer implementar algo como a rotação pelo algoritmo Área Mapeamento ele descreve na segunda parte da página.
Outras dicas
Solução geral:. Para cada pixel na imagem de destino, ter o pixel na imagem de origem com as coordenadas do pixel de destino, rodado no sentido oposto
Enhancement a solução: A rotação geralmente não vai dar coordenadas exatas do pixel. Fazer uma média ponderada do pixel de origem com os seus vizinhos, de acordo com o percentual se sobrepõe-los.
solução mais rápida para imagens binárias: Converter a imagem em "corridas" de pixels do primeiro plano consecutivos. Em seguida, gire as extremidades dessas linhas e atraí-los para o destino.
Normalmente este irá produzir pequenas aberturas, devido à arredondamento número inteiro, de modo que quando um ou ambos os pontos finais são mais do que 10% de distância a partir de um número inteiro, remendo por desenho duas linhas para a linha da fonte única, usando as coordenadas de número inteiro arredondado para cima e para baixo.
Se um ponto de extremidade é de 10% e o outro não é, as duas linhas formarão uma forma de 'V'. Se ambos estão desligados por mais do que 10%, as duas linhas formarão uma forma 'X'.
Isto pode ser feito em relação ao eixo X ou do eixo Y. Use aquele com o menor ângulo entre o eixo e o ângulo de rotação. (Isto é, se o ângulo de rotação é de entre 45 e -45, usar o eixo X.)
Ainda mais rápida solução para imagens binárias:. Se houver menos de fundo pixels do que primeiro plano pixels, preencher o destino com primeiro plano, e siga o algoritmo acima com fundo pixels
Nokia têm um artigo e código em Rodar Imagens em Java ME
LWUIT pode fazer isso e é opensource. Eu sugiro que você encontrar o código lá.
Primeiros passos com o Mobile Gráficos 2D para J2ME: http: // developers.sun.com/mobility/midp/articles/s2dvg/index.html
http://j2mepolish.org/javadoc/j2me /de/enough/polish/util/ImageUtil.html
Você pode tentar http://www.j2mearmyknife.com/ . Ele apresenta uma série de efeitos visuais interessantes, incluindo rotação de imagem.
Graphics2D e AffineTransform irá ajudá-lo a fazer exatamente o que você quer. Especificamente, Graphics2D.drawImage (Imagem, AffineTransform) e AffineTransform.getRotateInstance. Você também pode fazer dimensionamento, tradução e corte com isso. Ambas as classes têm sido no tempo de execução desde pelo menos 1,4, provavelmente mais cedo.
public Image rotateImage(Image img, float degrees){
BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
sourceBI.getGraphics().drawImage(img,0,0,null);
AffineTransform at = new AffineTransform();
at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
return bio.filter(sourceBI, null);
}