从RGB数据的int数组中创建PNG文件

5

我从PNG图像中获取了整数数组,如何将其转换为bufferdimage或创建新的PNG文件?

int[] pixel = new int[w1*h1];
        int i = 0;
        for (int xx = 0; xx < h1; xx++) {
            for (int yy = 0; yy < w1; yy++) {
                        pixel[i] = img.getRGB(yy, xx);
                        i++;
                }
         }

可能是从PNG读取像素的重复问题。 - Elliott Frisch
3个回答

2

如果你有一个整数数组,其中包含RGB值,以下是保存到文件的Java代码:

int width = 100;
int height = 100;
int[] rgbs = buildRaster(width, height);

DataBuffer rgbData = new DataBufferInt(rgbs, rgbs.length);

WritableRaster raster = Raster.createPackedRaster(rgbData, width, height, width,
    new int[]{0xff0000, 0xff00, 0xff},
    null);

ColorModel colorModel = new DirectColorModel(24, 0xff0000, 0xff00, 0xff);

BufferedImage img = new BufferedImage(colorModel, raster, false, null);

String fname = "/tmp/whatI.png";
ImageIO.write(img, "png", new File(fname));
System.out.println("wrote to "+fname);
< p> 数组 0xff0000、0xff00、0xff 的原因是RGB字节与最不重要的字节中的蓝色打包在一起。如果您打包整数不同,请更改该数组。


1
您可以手动重新构建图像,但这是一个相当昂贵的操作。
BufferedImage image = new BufferedImage(64, 64, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();

for(int i = 0; i < pixels.size(); i++)
{
    g.setColor(new java.awt.Color(pixels.get(i).getRed(), pixels.get(i).getGreen(), pixels.get(i).getBlue()));
    g.fillRect(pixels.get(i).getxPos(), pixels.get(i).getyPos(), 1, 1);
}

try 
{
    ImageIO.write(image, "PNG", new File("imageName.png"))
} 

catch(IOException error) 
{
    error.printStackTrace();
}

我将您的图像数组格式化为对象,这是个人偏好(当然,您也可以使用int数组与此模型一起使用)。请记住,您始终可以将alpha添加到其中。

0
尝试使用ImageIO类,它可以接受一个表示像素数据的字节数组来构建图像对象,并以特定格式将其写出。
try {
    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(yourBytes));
    ImageIO.write(bufferedImage, "png", new File("out.png"));
} catch (IOException e) {
    e.printStackTrace();
}

我有一个整数数组而不是字节数组。 - Hassan Bendouj
1
主线程中出现异常:java.lang.IllegalArgumentException: image == null! 在javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)处 在javax.imageio.ImageIO.getWriter(Unknown Source)处 在javax.imageio.ImageIO.write(Unknown Source)处 - Hassan Bendouj
为什么需要一个int数组?RGB值从0到255。 - MxLDevs
因为我的PNG图像的前两个像素被处理成整数。 - Hassan Bendouj
@ELMEKKIAnouar 我不明白为什么你需要将RGB值存储为整数与此有任何关系。 - MxLDevs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接