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

时间:2014-01-09 21:16:14

标签: java image

我从png图像获取int数组如何将其转换为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++;
                }
         }

3 个答案:

答案 0 :(得分: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);

数组0xff0000, 0xff00, 0xff的原因是RGB字节在最低有效字节中用蓝色打包。如果打包不同,请更改该数组。

答案 1 :(得分: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。

答案 2 :(得分:0)

尝试ImageIO类,它可以使用表示像素数据的字节数组来构建图像对象,然后以特定格式写出来。

try {
    BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(yourBytes));
    ImageIO.write(bufferedImage, "png", new File("out.png"));
} catch (IOException e) {
    e.printStackTrace();
}