2013-03-14 12 views
39

Widzę, że wiele osób miało podobny problem, jednak nie mam jeszcze próbować znaleźć dokładnie tego, czego szukam.Java: BufferedImage do tablicy bajtów iz powrotem

Tak, mam metodę, która odczytuje obraz wejściowy i konwertuje go do tablicy bajtów:

File imgPath = new File(ImageName); 
    BufferedImage bufferedImage = ImageIO.read(imgPath); 
    WritableRaster raster = bufferedImage .getRaster(); 
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

Co ja teraz chcę zrobić, to przekonwertować go z powrotem do BufferedImage (mam aplikację, dla której Potrzebuję tej funkcjonalności). Zauważ, że "test" to tablica bajtów.

BufferedImage img = ImageIO.read(new ByteArrayInputStream(test)); 
    File outputfile = new File("src/image.jpg"); 
    ImageIO.write(img,"jpg",outputfile); 

Jednak ta zwraca następującą wyjątek:

Exception in thread "main" java.lang.IllegalArgumentException: im == null! 

To dlatego IMG BufferedImage jest zerowy. Myślę, że ma to coś wspólnego z faktem, że w mojej pierwotnej konwersji z BufferedImage na tablicę bajtową, informacje są zmieniane/tracone, aby dane nie mogły być już rozpoznane jako jpg.

Czy ktoś ma jakieś sugestie, jak rozwiązać ten problem? Byłbym bardzo doceniony.

Odpowiedz

58

ta jest zalecana do konwersji do tablicy bajtów

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(img, "jpg", baos); 
byte[] bytes = baos.toByteArray(); 
+3

Flush i blisko zrobi nic –

+6

Czy istnieje szczególny powód, aby używać jpg tutaj? – hguser

+1

A jeśli close() nie zrobił nic, to wywoływałoby samą flush() i konieczne byłoby wywołanie go * przed * doByteArray(), a nie po nim. – EJP

6

Należy zauważyć, że wywołanie close lub flush nic nie zrobi, można to zobaczyć na własne oczy, patrząc na ich źródło/Doc:

Zamknięcie obiektu ByteArrayOutputStream nie daje żadnego efektu.

Metoda opróżniania OutputStream nic nie robi.

zatem używać coś takiego:

ByteArrayOutputStream baos = new ByteArrayOutputStream(THINK_ABOUT_SIZE_HINT); 
boolean foundWriter = ImageIO.write(bufferedImage, "jpg", baos); 
assert foundWriter; // Not sure about this... with jpg it may work but other formats ? 
byte[] bytes = baos.toByteArray(); 

Oto kilka linków dotyczących wskazówkę rozmiar:

Powiązane problemy