加载缩放的BufferedImage的像素

时间:2014-02-03 17:03:57

标签: bufferedimage pixels

我正在尝试将图像缩放到不同的宽度和高度。然后从缩放图像的像素创建像素阵列。问题是我收到了错误。

 java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage    

我能以任何方式获得新尺寸图像的像素吗?

这是代码:

protected void scaleImage(int newWidth, int newHeight) {
    try {

        BufferedImage image = (BufferedImage) img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);

        width = newWidth;
        height = newHeight;
        scaledWidth = newWidth;
        scaledHeight = newHeight;
        //re init the pixels
        pixels = new int[scaledWidth * scaledHeight];

        ((BufferedImage) image).getRGB(0, 0, scaledWidth, scaledHeight, pixels, 0, scaledWidth);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }
}

1 个答案:

答案 0 :(得分:1)

您遇到的问题是image.getScaledInstance(...)会返回图片,无论imageImage还是BufferedImage

现在,由于这个原因(以及其他主要与性能相关的),建议不要使用image.getScaledImage(...)。有关详细信息,请参阅示例The Perils of Image.getScaledInstance(),以及一些替代缩放方法。

根据您的代码改编,您可以使用:

int newWidth, int newHeight; // from method parameters

BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();

try {
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g.drawImage(img, 0, 0, newWidth, newHeight, null);
}
finally {
    g.dispose();
}

scaledWidth = newWidth;
scaledHeight = newHeight;

//re init the pixels
pixels = new int[scaledWidth * scaledHeight];
image.getRGB(0, 0, scaledWidth, scaledHeight, pixels, 0, scaledWidth);

请参阅上面的链接以获取逐步替代方案,或使用类似imgscalr的库来获得更好的结果。

如果确实想要在阅读上述链接后使用getScaledInstace(),则可以使用ImageProducer/ImageConsumer API以异步方式获取像素。但API很老,使用起来有点不方便。