1

私の小さなJavaプログラムは、png画像を暗くしようとしています。Macでは正常に動作していますが、java1.7_07がインストールされているWindowsPCで実行しようとすると、空のJPanel以外は何も表示されず、画像が完全に消えます。

コードは次のとおりです。

class MapCanvas extends JPanel {
    private Color color;
    RescaleOp op;
    BufferedImage sourceImage, bi;

    public MapCanvas() {
        try {
            sourceImage = ImageIO.read(new File(MAP_FILENAME));

            bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB);

            op = new RescaleOp(.8f, 0, null);
            bi = op.filter(bi, null);

            Graphics2D g = bi.createGraphics();

            g.drawImage(sourceImage, 0, 0, 500, 382, null);
            g.dispose();

        } catch (Exception e) {
            e.printStackTrace();
        }

        // set size for the panel
        Dimension size = new Dimension(500, 382);
        this.setBackground(new Color(34, 102, 187));
        setPreferredSize(size);
        setSize(size);
        setLayout(null);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g2d = (Graphics2D) g;

        g2d.drawImage(bi, op, 0, 0);  
    }
}

なぜ私がこれを手に入れているのか誰か知っていますか?どうもありがとう。

4

2 に答える 2

0

私の間違いを指摘していただきありがとうございます。私の質問には不足しているコードがいくつかあります (Graphics2D g2d - 割り当てられていない変数です) ため、コンパイルされません。申し訳ありません。

これは私がそれを修正した方法です:

           `sourceImage = ImageIO.read(new File(MAP_FILENAME));

            bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB);

            float[] scales = { .5f, .5f, .5f, 1f };
            float[] offsets = new float[4];
            op = new RescaleOp(scales, offsets, null);

            Graphics2D g1 = bi.createGraphics();

            g1.drawImage(sourceImage, 0, 0, 500, 382, null);
            g1.dispose();

            op.filter(sourceImage, bi);`

scales 配列の RGB に同じ値を使用するだけで (そうあるべきです)、フィルター処理された画像を描画します。

            `g2d.drawImage(bi, 0, 0, 500, 382, null);`

乾杯

于 2012-12-05T22:42:30.960 に答える
0

問題はないようですが、この例についていくつかのことが飛び出します...

まず、なぜあなたがこれをしたのかわかりません...

try {
    sourceImage = ImageIO.read(new File("C:/Users/shane/Dropbox/issue453.jpg"));

    bi = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(), BufferedImage.TYPE_INT_ARGB);

    op = new RescaleOp(.1f, 0, null);
    bi = op.filter(bi, null);

    Graphics2D g = bi.createGraphics();

    g.drawImage(sourceImage, 0, 0, 500, 382, null);
    g.dispose();

} catch (Exception e) {
    e.printStackTrace();
}

それからこれをやった...

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2d = (Graphics2D) g;
    g2d.drawImage(bi, op, 0, 0);
}

あなたは基本的に二重に適用していRescaleOpます。

RescaleOpを直接適用するだけでsourceImage...

public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2d = (Graphics2D) g;
    g2d.drawImage(sourceImage, op, 0, 0);
}

パフォーマンスを気にしない限り、その場合はbi何もせずに単純に描画する必要がありますBufferedImageOp

g2d.drawImage(bi, 0, 0, this);

次に、メソッドで定義g2dしていないため、例はコンパイルされません。paintComponentこれは、見落とし (問題ありません) またはGraphicsオブジェクトをキャッシュしている (問題ありません) のいずれかです。

Graphicsオブジェクトはステートレスであり、再描画間で保持されません。それらをキャッシュしたり、依存したりしないでgetGraphicsください。

于 2012-11-29T22:34:25.733 に答える