2012-02-18 19 views
3

私は質問がかなり説明的だと思うので、Windows LiveフォトギャラリーのようにJSliderを使って簡単なズーム機能を実装したいと思います。Javaで画像を拡大/縮小する

私はすばやくオンラインで見ましたが、私が使用しようとしたコードはすべて、Eclipseにコピーするとエラーが発生しているようです。アプリケーションが会社名で販売される可能性があるため、第三者のライブラリを使用することは本当にありません。さらに、私は、エラーを防ぐために必要な安全基準があるかもしれないことに気付いていますが、私はこれらのことが分かりません。

誰かが画像をズームイン/ズームアウトするためのJavaコードを私に提供できるのであれば、それは大変感謝しています。事前に

おかげで、私は私はあなたがこれらのチュートリアルをチェックアウトをお勧めJScrollPane

答えて

8

元画像にスケール変換を使用すると簡単にこれを達成できます。 現在の画像の幅newImageWidth、現在のイメージの高さnewImageHeight、および現在のズームレベルzoomLevelと仮定すると、次の操作を行うことができます

int newImageWidth = imageWidth * zoomLevel; 
int newImageHeight = imageHeight * zoomLevel; 
BufferedImage resizedImage = new BufferedImage(newImageWidth , newImageHeight, imageType); 
Graphics2D g = resizedImage.createGraphics(); 
g.drawImage(originalImage, 0, 0, newImageWidth , newImageHeight , null); 
g.dispose(); 

、して表示領域に元画像、originalImageを、交換してくださいresizedImage

+0

ありがとうGETah、私はすでにコード内でこれを行う方法を持っていましたが、このperposeにも役立つかもしれないと私はクリックしませんでしたが、私がちょうどテストしたように - 明らかにできます! – Andy

+0

ああ、このメソッドは画像の透明度に影響を与えているようです(透明なビットは黒です)。なぜ問題を解決するかについて何らかのアイデアがありますか? – Andy

+0

@Andyそれは、AffineTransformを使用して画像の透明度を維持する必要があります...これをチェックしてくださいhttp://stackoverflow.com/a/2176977/782719 – GETah

1

に追加されますJLabelの内部ImageIconとして画像を使用する予定

PS:

  1. Tutorial jinni
  2. Java tips
  3. Java2s

これらは、コピー貼り付けのソリューションではない可能性がありますが、本当に良いスタートポイントだと思います。 希望するものを達成するのに役立ちます。

参考にする

+0

チュートリアルをお寄せいただきありがとうございます。私はJavaのヒントを見てきましたが、イメージを大きくしたり小さめにしているので混乱しています。すべてがズームですか?もしそうなら、標準の 'getScaledImage'メソッドは同じことをしますか? – Andy

+0

Java Tipsのチュートリアル(私はあなたがクイックフィックスの解決策を探していると思っていた)に同意します。真実です、それらのすべてを読んだわけではありませんが、3番目のものはあなたが探しているものかもしれません。 –

+0

私はGETahの答えを受け入れたので、Java Tipsチュートリアルで紹介されているコードで十分だと思います。私はGETahの答えを受け入れるしかありませんでした。なぜなら、それはよりconvientで直接的なものです。しかし、あなたも役に立つと思っていました。 (それは基本的にすべてのズームがその時であることが判明 - それは何らかの理由で本当に複雑な操作だと思った) – Andy

2

は、以下のようにしても、それを使用することができます。

public class ImageLabel extends JLabel{ 
    Image image; 
    int width, height; 

    public void paint(Graphics g) { 
     int x, y; 
     //this is to center the image 
     x = (this.getWidth() - width) < 0 ? 0 : (this.getWidth() - width); 
     y = (this.getHeight() - width) < 0 ? 0 : (this.getHeight() - width); 

     g.drawImage(image, x, y, width, height, null); 
    } 

    public void setDimensions(int width, int height) { 
     this.height = height; 
     this.width = width; 

     image = image.getScaledInstance(width, height, Image.SCALE_FAST); 
     Container parent = this.getParent(); 
     if (parent != null) { 
      parent.repaint(); 
     } 
     this.repaint(); 
    } 
} 

次に、あなたがあなたのフレームに、私はパーセント値を使用しているため、ズーム倍率、でズームする方法でそれを置くことができます。

public void zoomImage(int zoomLevel){ 
    int newWidth, newHeight, oldWidth, oldHeight; 
    ImagePreview ip = (ImagePreview) jLabel1; 
    oldWidth = ip.getImage().getWidth(null); 
    oldHeight = ip.getImage().getHeight(null); 

    newWidth = oldWidth * zoomLevel/100; 
    newHeight = oldHeight * zoomLevel/100; 

    ip.setDimensions(newHeight, newWidth); 
} 
関連する問題