Java: BufferedImage do tablicy bajtów i z powrotem

Widzę, że wiele osób miało podobny problem, jednak muszę jeszcze spróbować znaleźć dokładnie to, czego szukam.

Więc 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();

To, co teraz chcę zrobić, to przekształcić go z powrotem w BufferedImage (mam aplikację, dla której potrzebuję tej funkcjonalności). Zauważ ,że" test " jest tablicą bajtów.

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

Zwraca jednak następujący wyjątek:

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

To dlatego, że BufferedImage img jest null. Myślę, że ma to coś wspólnego z faktem, że w mojej pierwotnej konwersji z BufferedImage do tablicy bajtów, informacje są zmieniane/tracone tak, że dane nie mogą być już rozpoznawane jako jpg.

Czy ktoś ma jakieś sugestie jak to rozwiązać? Byłabym bardzo wdzięczna.
Author: user1875290, 2013-03-14

2 answers

Zaleca się konwersję do tablicy bajtów

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] bytes = baos.toByteArray();
 64
Author: Nikolay Kuznetsov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-08 03:28:33

Zauważ, że wywołanie close lub flush nic nie da, możesz to zobaczyć na własne oczy, Patrząc na ich źródło / doc:

Zamknięcie strumienia Bajtearrayoutputstream nie ma wpływu.

Metoda spłukiwania strumienia nic nie robi.

Więc użyj czegoś 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 podpowiedzi o rozmiarze:

 6
Author: Christophe Roussy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:28