在Java中,从包含8位(灰度)或1位(二进制)数据的字节数组创建图像(bmp左右)

在Java中,从包含8位(灰度)或1位(二进制)数据的字节数组创建图像(bmp左右),java,image,binary,bufferedimage,grayscale,Java,Image,Binary,Bufferedimage,Grayscale,我有一个字节数组,每个像素包含8位的灰度数据,或者每个像素包含1位的二进制数据 我试过了,但它不起作用,我认为它需要每像素4字节(32位): BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray)); ImageIO.write(image, "BMP", new File("filename.bmp")); 我可以在BuffereImage中将数据类型更改为1位或8位吗?在一个稍微类似的情况下,我使用了光栅

我有一个字节数组,每个像素包含8位的灰度数据,或者每个像素包含1位的二进制数据

我试过了,但它不起作用,我认为它需要每像素4字节(32位):

BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray));
ImageIO.write(image, "BMP", new File("filename.bmp"));

我可以在BuffereImage中将数据类型更改为1位或8位吗?

在一个稍微类似的情况下,我使用了
光栅
BuffereImage
。请参见此灰度为8位的简单示例:

public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setSize(600, 400);
    f.getContentPane().setLayout(new BorderLayout());
    BufferedImage bi = new BufferedImage(200, 100, BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster wr = bi.getRaster();
    for (int col=0; col<bi.getWidth(); col++) {
        for (int row=0; row<bi.getHeight(); row++) {
            wr.setPixel(col, row, new int[] {(col+row)&0xff});
        }
    }
    JLabel l = new JLabel(new ImageIcon(bi));
    f.getContentPane().add(l, BorderLayout.CENTER);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
}
publicstaticvoidmain(字符串[]args){
JFrame f=新的JFrame();
f、 设置大小(600400);
f、 getContentPane().setLayout(新的BorderLayout());
BuffereImage bi=新的BuffereImage(200100,BuffereImage.TYPE_BYTE_GRAY);
WritableRaster wr=bi.getRaster();

对于(int col=0;col,在一个稍微类似的情况下,我使用了
光栅
缓冲图像
。请参阅这个带有灰度8位的简单示例:

public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setSize(600, 400);
    f.getContentPane().setLayout(new BorderLayout());
    BufferedImage bi = new BufferedImage(200, 100, BufferedImage.TYPE_BYTE_GRAY);
    WritableRaster wr = bi.getRaster();
    for (int col=0; col<bi.getWidth(); col++) {
        for (int row=0; row<bi.getHeight(); row++) {
            wr.setPixel(col, row, new int[] {(col+row)&0xff});
        }
    }
    JLabel l = new JLabel(new ImageIcon(bi));
    f.getContentPane().add(l, BorderLayout.CENTER);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
}
publicstaticvoidmain(字符串[]args){
JFrame f=新的JFrame();
f、 设置大小(600400);
f、 getContentPane().setLayout(新的BorderLayout());
BuffereImage bi=新的BuffereImage(200100,BuffereImage.TYPE_BYTE_GRAY);
WritableRaster wr=bi.getRaster();

对于(int col=0;col谢谢,它可以工作!我使用了:
BuffereImage image=new BuffereImage(picWidth,picHeight,BuffereImage.TYPE_BYTE_GRAY);image.getRaster().setDataElements(0,0,picWidth,picHeight,textureArray);
textureArray是包含灰度值的字节数组。我想你也可以用它来代替WritableRaster!谢谢你,它可以工作!我用了这个:
BuffereImage image=new BuffereImage(picWidth,picHeight,BuffereImage.TYPE_byte_gray);image.getRaster().setDataElements(0,0,picWidth,picHeight,textureArray);
textureArray是包含灰度值的字节数组。我想你也可以用它来代替WritableRaster!