1

我的小型 Java 程序试图使 png 图像变暗。它在我的 Mac 上运行良好,但是当我尝试在安装了 java 1.7_07 的 Windows PC 上运行它时,除了一个空的 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

我似乎没有任何问题,但是,关于这个例子,我突然想到了几件事......

首先,我不明白你为什么这样做......

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);

其次,您的示例将无法编译,因为您尚未g2dpaintComponent方法中定义。这要么是疏忽(这很好),要么是您正在缓存Graphics对象,这不好。

Graphics对象是无状态的,它们不会在重绘之间持续存在,你不应该缓存它们或依赖getGraphics.

于 2012-11-29T22:34:25.733 回答
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 回答