java - 从 Java 图像中检索像素数据

标签 java image bufferedimage scaling

最近我一直在尝试在 Java 中缩放像素数组 (int[])。我使用 .setRGB() 将所有像素数据添加到 BufferedImage 中。然后 BufferedImage 提供一个名为 .getScaledInstance() 的函数。这对于我的目的来说应该很有用,但我遇到了一个问题。 .getScaledInstance() 返回一个 Image,而不是 BufferedImage。对于 Image 对象,我无法使用 .getRGB() 将缩放后的 Image 中的所有像素数据(以 int[] 形式)添加回数组中。有没有办法从图像文件中获取原始像素数据?我错过了什么吗?我查看了其他问题并做了一些谷歌搜索,他们似乎只想以不同形式的数组(int [] [])或字节获取图片数据。任何帮助将不胜感激,谢谢。另外,Sprite 是我制作的一个正在使用的类。这是我的代码:

public Sprite scaleSprite(Sprite s, int newWidth, int newHeight){

    BufferedImage image = new BufferedImage(s.getWidth(), s.getHeight(),  BufferedImage.TYPE_INT_RGB);
    for(int y = 0; y < s.getHeight(); y++){
        for(int x = 0; x < s.getWidth(); x++){
            image.setRGB(x, y, s.getPixel(x, y));

        }
    }
    Image newImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_AREA_AVERAGING);
    Sprite newS = new Sprite(newWidth, newHeight);
    int[] pixels = new int[newWidth * newHeight];
    newImage.getRGB(0, 0, newWidth, newHeight, pixels, 0, newWidth); //This is where I am running into problems. newImage is an Image and I cannot retrieve the raw pixel data from it.

    newS.setPixels(pixels);
    return newS;
}

最佳答案

您可以将生成的Image绘制到BufferedImage上,如下所示:

Image newImage = image.getScaledInstance(newWidth, newHeight, Image.SCALE_AREA_AVERAGING);
BufferedImage buffImg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) buffImg.getGraphics();
g2.drawImage(newImage, 0, 0, 10, 10, null);
g2.dispose();

或者您可以通过在另一个 BufferedImage 上绘制图像来直接缩放图像:

BufferedImage scaled = new BufferedImage(newWidth, newWidth, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2 = (Graphics2D) scaled.getGraphics();
g2.drawImage(originalImage, 0, 0, newWidth, newWidth, 0, 0, originalImage.getWidth(), originalImage.getHeight(), null);
g2.dispose();

如果两个 BufferedImages 具有相同的宽高比,第二种方法将正常工作。

关于java - 从 Java 图像中检索像素数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29065746/

相关文章:

java - 向图像添加噪声

java - 在 Java 中使用 Hadoop

html - 背景图像垂直滚动但粘在容器的一侧

java - 在 Java 中围绕 repaint() 工作

java - 如何从任何计算机读取文件 (Java)

java - 打印图像中的行分隔符

java - Java中如何从json请求中获取特定值

java - 如何避免 java.io.StreamCorruptedException?

java - 从代码参数获取 Facebook OAuth token

javascript - 计算图像 map 上多边形区域的宽度和高度