我的绘画有点问题。
我使用以下方法加载图像:

public Image getImage(String name) {
    Image image = (Image) this.storage_images.get(name);

    if((image == null) && (!name.endsWith("-"))) {
        try {
            InputStream stream = this.getClass().getResourceAsStream(name);

            if(stream != null) {
                byte[] image_bytes  = new byte[stream.available()];
                stream.read(image_bytes);
                image               = Toolkit.getDefaultToolkit().createImage(image_bytes);
            }
        } catch (Exception exception) {
            System.err.println("Unable to read image from JAR.");
        }

        if(image == null) {
            try {
                image = this.client.getImage(this.client.getCodeBase(), name);
            } catch (Exception exception) {
                System.out.println("ERROR: while receiving image(" + name + "): " + exception);
            }
        }

        if(image != null) {
            this.client.prepareImage(image, null);
            this.storage_images.put(name, image);
        }
    }

    return image;
}


当我绘制图像时,它会被切掉-奇怪的是。我只更改与高度成比例的。原始图片的尺寸为256x256。

这是问题所在:
在appletviewer(日食)上,这似乎是正确的。但是,当我编译它并在我的Web浏览器上打开它时,图像将被剪切(请参阅底部的屏幕截图)。

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2   = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    new int[] {
        40,     // position left
        10,     // position top
        65,     // width (Original is 256)
        65      // height (Original is 256)
    };
    g2.drawImage(getImage("warning.png"), insets.right + data[0], insets.bottom + data[1], data[2], data[3], null);
}


我希望你能告诉我,我做错了。

Webbrowser上的结果



Eclipse IDE *中AppletViewer上的结果

最佳答案

这是问题所在。

byte[] image_bytes  = new byte[stream.available()];


可用值不是完整的图像大小,仅是下次读取时保证可用的字节数。

但无论如何,这些废话都不是必须的。大多数可以加载图像的方法都被重载以接受InputStream

进一步说明

g2.drawImage(
     getImage("warning.png"),
     insets.right + data[0],
     insets.bottom + data[1],
     data[2],
     data[3],
     null);


应该可能是:

g2.drawImage(
     getImage("warning.png"),
     insets.right + data[0],
     insets.bottom + data[1],
     data[2],
     data[3],
     this);


要获得比“可能”更好的结果,请发布MCTaRE(最小完整测试和可读示例)。

09-12 04:34