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.2 answers
Zaleca się konwersję do tablicy bajtów
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] bytes = baos.toByteArray();
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:
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