从 Java 图片中检索像素数据
Retrieving pixel data from Java Image
最近我一直在尝试缩放 Java 中的像素数组 (int[])。我使用 .setRGB() 将所有像素数据添加到 BufferedImage 中。 BufferedImage 然后提供一个名为 .getScaledInstance() 的函数。这对我的目的应该很有用,但我 运行 遇到了问题。 .getScaledInstance() returns 图像,而不是 BufferedImage。对于 Image 对象,我无法使用 .getRGB() 将缩放图像中的所有像素数据(以 int[] 形式)添加回数组。有没有办法从图像文件中获取原始像素数据?我错过了什么吗?我查看了其他问题并进行了一些谷歌搜索,他们似乎只是想以不同的数组形式 (int[][]) 或以字节为单位获取图片数据。任何帮助将不胜感激,谢谢。另外,Sprite 是我做的 class 正在使用。这是我的代码:
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;
}
需要说明的是,getScaledInstance()
是Image
的方法,不是BufferedImage
的方法。在使用 BufferedImage
后,您通常不想恢复直接使用 Image
超类; 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
级别进行扩展。从那里你可以应用任何你想要的精灵特定或数组数据算法。
您可以像这样将结果 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 中的像素数组 (int[])。我使用 .setRGB() 将所有像素数据添加到 BufferedImage 中。 BufferedImage 然后提供一个名为 .getScaledInstance() 的函数。这对我的目的应该很有用,但我 运行 遇到了问题。 .getScaledInstance() returns 图像,而不是 BufferedImage。对于 Image 对象,我无法使用 .getRGB() 将缩放图像中的所有像素数据(以 int[] 形式)添加回数组。有没有办法从图像文件中获取原始像素数据?我错过了什么吗?我查看了其他问题并进行了一些谷歌搜索,他们似乎只是想以不同的数组形式 (int[][]) 或以字节为单位获取图片数据。任何帮助将不胜感激,谢谢。另外,Sprite 是我做的 class 正在使用。这是我的代码:
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;
}
需要说明的是,getScaledInstance()
是Image
的方法,不是BufferedImage
的方法。在使用 BufferedImage
后,您通常不想恢复直接使用 Image
超类; 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
级别进行扩展。从那里你可以应用任何你想要的精灵特定或数组数据算法。
您可以像这样将结果 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
具有相同的纵横比,则第二种方法将正常工作。