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

Foi útil?

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

fóruns

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á.

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);
  }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top