Создайте изображение (bmp или около того) из массива байтов, содержащего 8-битные (оттенки серого) или 1-битные (двоичные) данные в Java

У меня есть либо массив байтов, содержащий данные в оттенках серого в 8 битах на пиксель, либо содержащий двоичные данные в 1 битах на пиксель.

Я пробовал это, но он не работает, я думаю, что он занимает 4 байта (32 бита) на пиксель:

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

Могу ли я изменить тип данных на 1 бит или 8 бит в BufferedImage?


person atpanos    schedule 03.07.2012    source источник


Ответы (1)


В немного похожей ситуации я использовал Raster с BufferedImage. См. этот простой пример с 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);
}

Не помню, поддерживает ли BufferedImage 1 бит на пиксель. Вы, вероятно, захотите посмотреть на варианты setPixels, которые устанавливают много пикселей одновременно.

person Rainer Schwarze    schedule 03.07.2012
comment
Спасибо, это работает! Я использовал это: BufferedImage image = new BufferedImage(picWidth, picHeight, BufferedImage.TYPE_BYTE_GRAY); image.getRaster().setDataElements(0, 0, picWidth, picHeight, textureArray); textureArray — массив байтов, содержащий значения серого. Я думаю, вы тоже можете использовать это вместо WritableRaster! - person atpanos; 04.07.2012