CANVASに画像を表示し、その画像を回転させるようにしたいのですが、どうにもうまくいかなくて困っています。

画像の中心を軸に回転させたいと思って以下のように実装してみたのですが、うまくいきません。

//////////////////////////////以下抜粋////////////////////////////////
Matrix matrix;

// Bitmap のサイズの取得
int width = bmp.getWidth();
int height = bmp.getHeight();

matrix = new Matrix();

// 画像の中心を軸に回転させるようにする(ここがうまくいっていないっぽい・・・)
matrix.postRotate(5.0f, width / 2.0f, height / 2.0f);

// 回転させた画像を生成する
bmp2 = Bitmap.createBitmap(bmp, 0, 0, width, height, matrix, true);

// CANVASに画像を描画する
canvas.drawBitmap(bmp2 , 10.0f, 10.0f, paint);

//////////////////////////////////////////////////////////////////////

上記のコードで画像自体は回転するのですが、中心軸がずれてしまっているようです。

画像のサイズは横15ピクセル、縦15ピクセルとなっております。

また、matrix.postRotateの前でmatrix.postTranslate()にて軸を設定してみたのですが、
これもうまくいきませんでした。

きれいに画像を回転させるにはどのようにすればよいか、わかる方いましたら教えて
いただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

その方式ならちゃんと中心で回ってますが、


表示される位置が変わるってことになります。
つまり元のは100px辺の正方形だったとしても
bmp2にクリエイトビットマップされるときにはbmp2は幅100ではなくなってるんです。
45度にかたむけたとしたら100px正方の対角線の長さに画像の大きさが大きくなってしまい。
そのbmp2の描くポジションが同じ数値位置にとどめアニメなどするとぎったんばっこんすることになります。
なので、そのbmp2をクロップし100px幅のに収めるか、(図によっては角が切れます)。
もしくは、角度変えた都度都度表示位置をずらし修正してやります。
bmp2のgetWidth()と元bmpのgetWidth()の差の半分でトランスレート位置を計算し反映させれば真ん中でキレイに廻ってるように見せられるでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!!

言われみて気付きました。確かにそうですね。
画像を回転させると画像のサイズが大きくなってしまいますね!

解決しました、ありがとうございました!

お礼日時:2011/04/20 17:52

ちなみにbmp2のトランスレートてのは、そのマトリクスにするんでなく


キャンバスにドロウするときのx.y位置を都度都度ずらしたればいいという事になります
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q白い部分を透明にすることは可能ですか?

ペイントで白い部分を透明にすることは可能ですか?
やり方を教えてください。
ペイントじゃできないのかも教えてください。

Aベストアンサー

 残念ながらペイントでは、まわりが、白いままです。
 
 お使いのパソコンのOSが、一致するようでしたら
 
 無料のソフト「GIMP」(ギンプ)を使用することをおすすめします。

 ・Gimp2のダウンロードページ
 http://www.geocities.jp/gimproject2/download/gimp-download.html


 ・GIMP(ギンプ)の使い方
透過(透明な部分を作る技法)
 保存は、gifかpngの拡張子にして下さい

  http://www.geocities.jp/gimpmanual/manual.html

 ※jpgは、写真を構成するのが、目的な拡張子ですので
   まわりが、白くなり透明には、なりません。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QJavaでポインタ的なことはできるか?

JavaでC言語のようにポインタを使おうとしたらJavaには
ポインタが表面上はサポートされていないことを知りました。

関数を呼び出した際に、呼び出し元の変数に影響を与えるようなプログラムは
Javaで作れるのでしょうか?
例えば、以下のプログラムはCで関数を呼び出した際に呼び出し元の
変数の中身を関数内で書き換えてしまうプログラムです。
こういうことをJavaでするにはどう書けばよいのでしょうか?
もしこういうことができないのであれば、Javaにはポインタに代わるやりかたがあるのでしょうか?

実行結果:
1 10

#include <stdio.h>

void func( int *n ){
  *n = 10;
}

int main(){
  int n = 1;
  printf("%d ", n );
  func( &n );
  printf("%d ", n );
}

Aベストアンサー

質問のコードを書き直すと
private void func(Integer n){
  n = 10;
}

public static void main(String[] args){
  Integer n = 1;
  System.out.printf("%d ", n );
  func( n );
  System.out.printf("%d ", n );
}

Javaのプリミティブ型にはそれぞれをラップした型があります。
int Integer
long Long
short Short
double Double
float Float
byte Byte
char Character
boolean Boolean

Qjavaでは基本型の参照渡しは無理ですか?

先日のjavaの授業で値渡しと参照渡しについて学びました。
授業では

オブジェクトは参照渡しになり
基本型は値渡しにされる(参照渡しは不可能)

と教えられました。

オブジェクトを値渡しにできないのはなんとなく納得できたのですが
基本型を参照渡しにできないのが納得できません。

そこで
1.基本型を参照渡しにすることはできないのか?

2.基本型を参照渡しすることができないのはなぜか?

3.オブジェクトを値渡しすることができないのはなぜか?

の3点を教えて頂きたいです。
よろしくお願いします。

Aベストアンサー

No1の方がおっしゃる通り、Javaでは全て値渡しです。
オブジェクトは参照データ型といわれる型になります。
参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。
わかりやすく説明されているサイトをご紹介します。

という前提で疑問に私なりの回答をしてみます。

1.基本型を参照渡しにすることはできないのか?
  基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。
  
2.基本型を参照渡しすることができないのはなぜか?
  1.のような方法で【Natsu0611さんが思われているような参照渡し】は可能ではないでしょうか。

3.オブジェクトを値渡しすることができないのはなぜか?
  おそらくではありますが、メモリ管理の問題ではないでしょうか。

回答が合っているかどうかはちょっと自信は無いですが・・・。

参考URL:http://java.269ch.jp/archives/2005/07/post_6.html

No1の方がおっしゃる通り、Javaでは全て値渡しです。
オブジェクトは参照データ型といわれる型になります。
参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。
わかりやすく説明されているサイトをご紹介します。

という前提で疑問に私なりの回答をしてみます。

1.基本型を参照渡しにすることはできないのか?
  基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。
  
2.基本型を参...続きを読む

Qcssで「下よせ」ってどうやっていますか?

フロートのレフト、ライトはいいとして、

あるボックス要素内(A)に異なるボックス要素(B)をいれます。
この(B)を(A)の一番そこにはりつかせたい時にどうすれば
最もよいのでしょうか?

いいアイデアをご教授ください。

Aベストアンサー

こんなのはどうかな?

position: absolute;
bottom: 0px;


人気Q&Aランキング

おすすめ情報