2017-05-20 9 views
2

私はそれについて検索しましたが、私はまっすぐ答えを得ていませんでした。 私は新しい次元つもりこのバッファリングされたイメージをトリミングせずに回転させるには? JLayeredPaneまたはJLabelを回転する方法はありますか?

int w = originalImage.getWidth(); 
int h = originalImage.getHeight(); 
double toRad = Math.toRadians(degree); 
int hPrime = (int) (w * Math.abs(Math.sin(toRad)) + h * Math.abs(Math.cos(toRad))); 
int wPrime = (int) (h * Math.abs(Math.sin(toRad)) + w * Math.abs(Math.cos(toRad))); 

のようないくつかの事は私にそのための方法を提供することがある知っていたバッファリングされた画像を回転させることにしたいが、 をトリミングません。

JLabelImageIconでローテーションする方法はありますか?

意図:パネルとレイヤードペインに追加し、ファイルに保存する(レイヤードペインを保存する)。

レイヤードペインを回転できますか?

+0

は* "バッファリングを回転させる方法JlayeredpaneまたはJlabelを回転させる方法はありますか? "*もち​​ろん、イメージが幅と高さをいっぱいに満たしていれば、th回転された画像の寸法はより大きくする必要がある。それは単純なジオメトリです。 –

+0

*「意図:パネルとレイヤーペインに追加し、ファイルに保存する(レイヤーペインを保存する)」*イメージが回転する必要がある理由については何も説明していません。しかし、あなたがそれを述べて以来、コンポーネント自体を直列化しようとは勧めません。詳細を除いて、私はすべての画像(回転した画像を含む)を大きな画像に書き込み、その大きな画像をシリアライズする傾向があります。 –

答えて

0

ところで、ImageIconでJLabelを回転させる方法はありますか?

簡単な方法は、ラベルではなくアイコンを回転させることです。

回転を行うクラスのRotated Iconをチェックして、アイコンが回転したときのサイズを再計算します。

意図:パネルとレイヤードペインに追加し、ファイルに保存する(レイヤードペインを保存する)。

レイヤーペインの「イメージ」を保存するだけの場合は、Screen Imageをチェックしてください。

2

バッファリングされたイメージをトリミングせずに回転させる方法はありますか?

あなたは既に回転したBufferedImageのサイズを計算することで作業の半分を行っていました。 残りの半分は実際には回転したBufferedImageを作成しています。 Graphics2D を使用して、元のイメージを新しいイメージに描画する前にいくつかの座標変換を適用することで可能です。さらに、「余分な」領域を背景色でペイントすることは理にかなっています。ここ

public BufferedImage rotateImage(BufferedImage originalImage, double degree) { 
    int w = originalImage.getWidth(); 
    int h = originalImage.getHeight(); 
    double toRad = Math.toRadians(degree); 
    int hPrime = (int) (w * Math.abs(Math.sin(toRad)) + h * Math.abs(Math.cos(toRad))); 
    int wPrime = (int) (h * Math.abs(Math.sin(toRad)) + w * Math.abs(Math.cos(toRad))); 

    BufferedImage rotatedImage = new BufferedImage(wPrime, hPrime, BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = rotatedImage.createGraphics(); 
    g.setColor(Color.LIGHT_GRAY); 
    g.fillRect(0, 0, wPrime, hPrime); // fill entire area 
    g.translate(wPrime/2, hPrime/2); 
    g.rotate(toRad); 
    g.translate(-w/2, -h/2); 
    g.drawImage(originalImage, 0, 0, null); 
    g.dispose(); // release used resources before g is garbage-collected 
    return rotatedImage; 
} 

は、上記のコードからの試験例である:(30度)

オリジナル画像
original

回転画像
rotated

関連する問題