2009-07-28 12 views
6

Mam aplikację C++, która komunikuje się z kamerą i pobiera surowe dane obrazu. Następnie mam Byte [] w C++, który chcę wysłać do Javy z JNI.Jak utworzyć plik BMP z surowego bajtu [] w Javie

Muszę jednak przekonwertować surowy bajt [] na prawdziwy format pliku (.bmp był moim pierwszym wyborem). Mogę łatwo to zrobić, jeśli piszę to z C++ do pliku na twardym dysku, używając BITMAPFILEINFO i BITMAPHEADERINFO, ale nie wiem, jak by to było zrobić, przesyłając cały format do Javy.

Potem pomyślałem o wysłaniu tylko surowych danych bajtowych [] za pomocą JNI, a następnie konwersji do .bmp, ale nie mogę znaleźć żadnej dobrej biblioteki do robienia tego w Javie.

Jaki byłby mój najlepszy wybór? Konwertowanie obrazu w C++, a następnie wysyłanie go za pomocą JNI lub wysyłanie danych RAW do Java, a następnie konwertowanie na .bmp? Jak najłatwiej to osiągnąć?

Odpowiedz

6

To tylko dwie linie w Java 1.5:

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

Java (w systemie Windows) wie jak wyeksportować JPG, PNG i BMP o ile wiem.

+1

To rozwiązanie nie działa dla mnie. obraz jest zawsze zwracany jako null. Tak więc ImageIO.write zgłasza wyjątek. Tablica bajtów to nieprzetworzone dane obrazu Y. Czy możesz rozwinąć więcej? –

+0

Czy jesteś pewien, że twój bajtaramat jest prawidłowym obrazem? Myślę, że jedynym sposobem uzyskania 'image == null' jest brak zarejestrowanego ImageReadera, który może dekodować twój strumień. Domyślam się, że jest to typ pliku, który nie jest obsługiwany lub jest uszkodzony. – Stroboskop

+0

Jest to dane obrazu YUV o stosunku 4: 0: 0. –

4

Nie trzeba tego robić. Zmień tablicę bajtów w InputStream i podaj ją do ImageIO.read();

public Image getImageFromByteArray(byte[] byteArray){ 
    InputStream is = new ByteArrayInputStream(byteArray); 
    return ImageIO.read(is); 
} 

Spowoduje to utworzenie obiektu Image z tablicy bajtów, który jest bardzo banalny, aby wyświetlić go wewnątrz komponentu GUI. Jeśli chcesz go zapisać, możesz również użyć klasy ImageIO.

public void saveImage(Image img, String fileFormat, File f){ 
    ImageIO.write(img, fileFormat, f); 
} 
+0

Jesteś pewien, że to zadziała? W jaki sposób ImageIO będzie znał format pikseli przechowywanych w tablicy bajtów? –

+1

ponieważ sprawdza nagłówek pliku, tak jak każde inne narzędzie graficzne. – Stroboskop

+0

Jeśli masz tylko czysty bufor RGB, możesz zajrzeć do dokumentacji dotyczącej BufferedImage.setRGB() –

1

Jeśli wiesz jak napisać jak .bmp do pliku, a następnie można użyć (prawie) ten sam kod do zapisu do bufora pamięci zamiast. Ten bufor pamięci, który możesz przesłać do Javy, i dekodować taki format jak Stroboskop lub Markus Koivisto. Jeśli edytowałeś swoje pytanie, aby uwzględnić sposób zapisywania danych w pliku .bmp, mógłbym zasugerować, jak przekształcić to w operację w pamięci.