- - PR -
画像の回転
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-08-22 11:41
java appletで画像を回転させるようプログラムしました。75×140の画像の(43,0)を中心として平面状で回転させるものです。元の画像を、1ピクセルず、中心点の周りを回転させ、それを300×300のサイズのピクセルに移して描画すればできると思って、次のような式を作り、描画してみました。回転はちゃんとできたのですが、描画する角度によって、空白のピクセルができてしまって、ところどころに小さなピクセルの穴が空いてしまうのです。拡大するのならピクセルに穴が空くわけも分かるのですが、拡大するわけでもないのに…というのは何かの計算からくる数値がそうさせていると思うのです。
それを解消したいのですが、どうしたらよいのでしょうか。教えていただきたいです。 rは回転角度です。 XとYは、元の画像サイズ。1ピクセルずつを取り出して、回転させようとしています。 4行目の”Math.round”を”(int)”に変えると穴がいっぱいになったので、”Math.round”に変えたら、回転角(r=0)の時はまったく穴ができませんでした。 for( Y=0; Y<140; Y++ ){ for(X=0; X<75; X++ ){ double hannkei=Math.sqrt(Math.pow(X-43,2)+Math.pow(Y,2)); tx=Math.round(hannkei*Math.sin(Math.atan2(X-43,Y)+Math.toRadians(r))); ty=Math.round(hannkei*Math.cos(Math.atan2(X-43,Y)+Math.toRadians(r))); pixels[(int)((ty+150)*300+tx+150)]=org[Y*tw+X]; } } mis.newPixels(); | ||||
|
投稿日時: 2004-08-22 12:03
ゴールデンさん、こんにちは。
変換元のピクセルから変換先のピクセルを求めているために 整数への切捨てでそうなったのでしょう。 逆に、変換先のピクセルに対応する変換もとのピクセルを求め る様にしたら隙間は空かなくなると思います。 あと、java.awt.geom.AffineTransformを使用するというのは どうでしょう? | ||||
|
投稿日時: 2004-08-22 14:15
>あと、java.awt.geom.AffineTransformを使用するというのは
>どうでしょう? Kissingerさん、ありがとうございます。 java.awt.geom.AffineTransformというものをどのように使ったらよいのかが、リファレンスを見てもよくわかりませんでした。すみなせんが、もう少し詳しく教えていただけないでしょうか?AffineTransformの中の何をどのように使ったらよいかまで教いただけたら嬉しいです。 | ||||
|
投稿日時: 2004-08-22 23:57
java.awt.Component#paint(Graphics g)や
javax.swing.JComponent#paintComponent(Graphics g)内で java.awt.Graphics2D#drawImage(java.awt.geom.AffineTransform)を 使用します。 例です。
AffineTransformには rotate() のほかにも便利なメソッドが ありますが、行列を使った方がより抽象的で柔軟な画像操作 ができます。 | ||||
|
投稿日時: 2004-08-23 16:34
ありがとうございました。Graphics2Dは今まで一回も使ったことはありませんでしたので、未知の世界でしたが、例を出してくださったので、それをもとにしてコードを書きました。振り子のように揺れる画像が作りたかったのです。無事できて、とても勉強になりました。今後ともよろしくお願いします。
|
1