Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Создание BMP файла из массива байтов


Автор: bougle 2.5.2006, 15:45
Из сети принимается массив байтов. 152х200 точек 8-битного серого изображения. Нужно сохранить его в формате BMP
Мое решение:
Так как массив полностью идентичен растру BMP файла, то просто добавляю к нему заголовок BMP.
Код

                FileInputStream meta = new FileInputStream("meta.dat");
                FileInputStream raster = new FileInputStream("raster.dat");
                File fing = new File("C:/finger.bmp");
                RandomAccessFile finger = new RandomAccessFile(fing,"rw");
                byte [] armeta = new byte[1078];
                byte [] arraster =new byte[30400];
                meta.read(armeta);
                raster.read(arraster);
                finger.write(armeta);
                finger.write(arraster);

meta.dat - Сохраненный заголовок для BMP файла такого формата.
raster.dat - Сохраненный битмап.
finger.bmp - Полученный BMP файл.
А как это сделать средствами  java. Для создания объекта BufferedImage нужен объект WritableRaster. А как его создать из массива байтов?    
Код

setDataElements(int x, int y, int w, int h, Object inData)

Sets the data for a rectangle of pixels from a primitive array of type TransferType.
В качестве Object inData можно поставить массив?
  

Автор: LSD 2.5.2006, 23:29
Если у тебя уже есть заголовок, пиши в файл вначале его а затем дописывай байты с картинкой и все, в чем трудности? Зачем тебе нужно создавать BufferedImage из массива байт? 

Автор: polosatij 3.5.2006, 02:00
можно сделать так:

Код

com.sun.image.codec.jpeg.JPEGImageEncoder
com.sun.image.codec.jpeg.JPEGCodec
//Hilfsklassen: java.awt.image.BufferedImage, java.awt.Graphics2D
//Codebeispiel:
Image img;
... // Das Bild wird erzeugt und manipuliert, z.B. über
// Filter, oder auch über ein Graphics-Objekt (!)
// Annahme: Die Pixeldaten seien bereits vollständig erzeugt
// Festlegen des Dateinamens:
FileOutputStream out = new FileOutputStream("MeinNeuesBild.jpg");
// Erzeugen des JPEG-Encoders für diesen OutputStream:
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
// Kopieren des Bildes in ein BufferedImage:
BufferedImage bImg = new BufferedImage(breite, höhe, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bImg.createGraphics();
g.drawImage(img, null, null); // Annahme: Kein ImageObserver mehr nötig
// Kodieren:
encoder.encode(bImg);
out.close();



и потом поменять ассоциацию на .bmp smile

с помощью:
Код

ImageProducer prod =
new MemoryImageSource(breite, höhe, pixels, 0, breite);


можно создать Image и нарисовать его в BufferedImage
pixels = это int[], т.е. то, что у тебя уже есть =)

удачи smile 

Автор: bougle 4.5.2006, 13:48
polosatij, извини, не понятно. Оставлю как есть.
Сегодня тестировали датчик. Приняли таки отпечаток пальца. Только вот на нем было некоторое количество малинового цвета. Мы с коллегой не поняли почему в картинке, которая должна быть серой по определению, появился цвет. К сожалению диска под рукой не оказалось и я сейчас не могу в спокойной обстановке рассмотреть файл.
Сейчас вспомнил, что прозрачный цвет может отображаться малиновым. Никто не помнит, в стандартной палитре 8-битного серого BMP точка прозрачного цвета равена 255?
*Ушел юзать поиск*
smile  

Автор: LSD 5.5.2006, 23:05
BMP не поддерживает прозрачность, ни в каком виде. Если только программа просмотра так себя ведет, например считая цвет верхнего левого угла прозрачным (так ведет себя Delphi).  

Автор: bougle 6.5.2006, 05:11
Точно, поюзал поиск. Дело оказалось в другом. Просто я заголовок отрезал от существующего 256-цветного BMP файла. Файл то был не серый, а цветной. Вот и все чудеса.
Сейчас пытался найти, как выглядит палитра 256-цветного серого BMP, но не могу найти даже на msdn. Не подскажете, как содать такую палитру? Или как создать такой BMP файл, а заголовок я вырежу для использования.
 

Автор: LSD 7.5.2006, 12:39
Цитата(bougle @  6.5.2006,  06:11 Найти цитируемый пост)
как создать такой BMP файл

Можно в фотошопе, New Image - Grayscale, 8 bit. 

Автор: bougle 8.5.2006, 02:26
У меня 6-ой фотошоп. Он с BMP отказывается работать.
Ладно, вот так выглядит изображение.
http://bougle.narod.ru/COMBM0.jpg

Только вот возникла проблема, что с датчика подключаемого через модем идут нереверсированные данные. В итоге изображение выглядит вот так:
http://bougle.narod.ru/UDPimage7.jpg
Сейчас создам тему про реверсию битов, это отдельный разговор. 

Автор: LSD 8.5.2006, 11:36
Цитата(bougle @  8.5.2006,  03:26 Найти цитируемый пост)
У меня 6-ой фотошоп. Он с BMP отказывается работать.

Ну тогда так:
Код
BufferedImage grayscaleImage = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_GRAY);
ImageIO.write(grayscaleImage, "BMP", new File("gray.bmp"));
 

Автор: bougle 9.5.2006, 03:04
Угумс, я тоже об этом подумал, но сделал почему не так. Скачал ACDSee 3.1. Точно помнил, что она в 256 градаций серого BMP сохраняет.
Какой-то у меня подход не програмерский. 

Всем спасибо за помощь! Надеюсь скоро сам буду писать ответы в помощь smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)