从Java Image中检索像素数据

时间:2015-03-15 20:20:17

标签: java image bufferedimage scaling

最近我一直试图在Java中扩展像素数组(int [])。我使用.setRGB()将我的所有像素数据添加到BufferedImage中。然后BufferedImage提供一个名为.getScaledInstance()的函数。这应该对我的目的很有用,但我遇到了一个问题。 .getScaledInstance()返回一个Image,而不是BufferedImage。使用Image对象,我无法使用.getRGB()将所有像素数据(以int []形式)从缩放后的Image添加回数组。有没有办法从Image文件中获取原始像素数据?我错过了什么吗?我查看了其他问题并进行了一些谷歌搜索,他们似乎只是想以不同形式的数组(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;
}

2 个答案:

答案 0 :(得分:1)

要明确指出,getScaledInstance()Image的方法,而非BufferedImage。一旦您使用Image,通常不希望恢复直接使用BufferedImage超类; Image真的不容易使用。

请查看这是否有用:How to scale a BufferedImage

或者从Scaling a BufferedImage,他们产生以下示例:

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;

public class Main {
  public static void main(String[] argv) throws Exception {
    BufferedImage bufferedImage = new BufferedImage(200, 200,
        BufferedImage.TYPE_BYTE_INDEXED);

    AffineTransform tx = new AffineTransform();
    tx.scale(1, 2);

    AffineTransformOp op = new AffineTransformOp(tx,
        AffineTransformOp.TYPE_BILINEAR);
    bufferedImage = op.filter(bufferedImage, null);
  }

这将使您能够在BufferedImage级别完全扩展。从那里你可以应用你想要的任何精灵特定或阵列数据算法。

答案 1 :(得分:1)

您可以将结果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具有相同的宽高比,第二种方法将正常工作。