algoritmo de rotação de imagem

votos
17

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 valores RGB do pixel, Meu problema é que eu preciso para implementá-lo para um projeto JavaME MIDP 2.0 então eu devo usar o código executável na JVM antes da 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

Publicado 27/01/2009 em 19:19
fonte usuário
Em outras línguas...                            


8 respostas

votos
19

Uma das melhores páginas que descrevem algoritmos de rotação de imagem que eu encontrei na internet está ligada a de Dan Bloomberg excelente biblioteca leptonica. Enquanto a própria biblioteca leptonica é escrito em C e não vai ajudar você, sua página em algoritmos de rotação de imagem:

http://www.leptonica.com/rotation.html

é definitivamente vale a pena ler. Você provavelmente irá querer implementar algo como a rotação pela Área algoritmo de mapeamento que ele descreve na segunda parte da página.

Respondeu 27/01/2009 em 19:33
fonte usuário

votos
7

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 para 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 à inteiro de arredondamento, por isso, quando um ou ambos os pontos finais são mais do que 10% de distância a partir de um número inteiro, por remendo desenho duas linhas para a linha da fonte única, usando a 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. (Ou seja, se o ângulo de rotação é de entre 45 e -45, usar o eixo X).

Solução ainda mais rápido para imagens binárias: Se houver menos de fundo pixels do que pixels de primeiro plano, preencher o destino com primeiro plano, e siga o algoritmo acima com fundo pixels.

Respondeu 24/02/2009 em 23:00
fonte usuário

votos
3

Fóruns Nokia têm um artigo e código em Rodar Imagens em Java ME

Respondeu 27/01/2009 em 19:38
fonte usuário

votos
1

LWUIT pode fazer isso e é opensource. Eu sugiro que você encontrar o código lá.

Respondeu 27/01/2009 em 22:08
fonte usuário

votos
0

Você pode tentar http://www.j2mearmyknife.com/ . Ele apresenta uma série de efeitos visuais interessantes, incluindo rotação de imagem.

Respondeu 29/06/2009 em 10:59
fonte usuário

Respondeu 27/01/2009 em 19:36
fonte usuário

votos
-2
  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);
  }
Respondeu 15/05/2010 em 15:47
fonte usuário

votos
-2

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.

Respondeu 27/01/2009 em 19:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more