2

単純に画像を表示する SWING コンポーネント JImageEditor を作成しました。アイデアは、さらに先のコンポーネントに機能を追加することです。

私がすでに実装した機能の 1 つはズームです。現在、この部分は paintComponent() メソッドで処理されています。ただし、これは、paintComponent() が呼び出されるたびに、画像が元のサイズから現在の「ズーム サイズ」にスケーリングされることを意味するため、これは悪い考えであると思われます。paintComponent コードは次のようになります。

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
            RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    int w = getWidth();
    int h = getHeight();
    double imageWidth = scale * image.getWidth();
    double imageHeight = scale * image.getHeight();
    double x = (w - imageWidth) / 2;
    double y = (h - imageHeight) / 2;
    AffineTransform at = AffineTransform.getTranslateInstance(x, y);
    at.scale(scale, scale);
    g2.drawRenderedImage(image, at);
}

さて、私が代わりに考えたのは、BufferedImage の 2 つのインスタンスを保持することでした。1 つはオリジナルで、もう 1 つは現在の「ビュー」です。そうすれば、paintComponent() でスケーリングする代わりに、setScale() メソッドが呼び出されるたびに実際のズーム/スケーリングを処理できます。ただし、欠点は、BufferedImage の 2 つのインスタンスを保持する必要があることです。これにより、画像サイズに応じてメモリ消費量が増加します。もちろん、特定のユーザーがこのコンポーネントを使用して開く画像のサイズを予測することは不可能です。

私が探しているのは、自分の仕事が正しい方向に進んでいる場合は親指を立てること、または設計が悪く、他の解決策を検討する必要がある場合は親指を立てることです。私はすべての入力に感謝し、私を啓発するすべての回答に報います:-)

4

1 に答える 1

3

paintComponent にタイミング セクションを配置して、所要時間を測定します。あなたが今持っているものからあなたの基本的な尺度を取得してください。次に、追加の BufferedImage を使用して最適化されたメソッドを実装します。大きさを比較して、小さい方を選びます。すべてのペイント サイクルでアフィン変換を行うのは遅く、スケーリングされたイメージとソース用にダブル バッファを作成することで、より高速になるというあなたの直感は正しいと感じています。これを確認または否定するものは何も見つかりませんが、ハードウェアアクセラレーションの影響を受ける可能性があります.

コードのそのセクションを ZoomableBufferedImage クラスに抽出すると、最適化されたバージョンと最適化されていないバージョンを簡単にオンまたはオフにすることができます。ZoomableBufferedImage は、ソース イメージへの参照を保持し、スケーリングされたバージョンを保持できる追加のバッファー イメージを含みます。ズーム イン/ズーム アウトすると、ZoomableBufferedImage はバッファーに描画されるか、その設定に基づいていないため、ペイント メソッドで描画されます。バッファから描画するか、AffineTransform をソースに適用して、その設定に基づいて描画することができます。

于 2011-08-27T15:53:26.770 に答える