2010-01-26 16 views
10

Mam reprezentację tablicy bajtów obrazu. Jak zapisać go na dysku jako plik obrazu.Jak zapisać tablicę bajtów jako plik obrazu na dysku?

I zrobiono to

OutputStream out = new FileOutputStream("a.jpg"); 
out.write(byteArray); 
out.flush(); 
out.close(); 

Ale kiedy otworzyć obraz poprzez podwójne kliknięcie, nie wykazują żadnego obrazu.

+0

czy chcesz napisać to jako PNG lub JPG, czy po prostu, abyś mógł go z powrotem przeczytać w pewnym momencie? –

+0

Czy masz rodzaj tablicy, którą możesz przekazać do image.setRGB? –

+1

Skąd wziął się bajt []? Musisz wiedzieć, jaki ma format (JPEG, GIF, PNG, BMP ...) – Thilo

Odpowiedz

7

innych niż braku użyć try/finally blok (przynajmniej w kodzie masz pokazane), które powinny być w porządku. (Nie trzeba opróżnić strumienia wyjściowego jeśli zamykając go, nawiasem mówiąc).

Jak to nie działa, to sugeruje byteArray nie faktycznie zawierać JPEG zakodowany obraz. W jaki sposób stworzyłeś byteArray na początek? Jeśli jest to "surowa" reprezentacja, prawdopodobnie będziesz chciał ją zakodować, np. przy użyciu pakietu javax.imageio.

+5

+1 dla "Nie musisz przepłukiwać strumienia wyjściowego, jeśli jesteś ...." –

+0

Czy możesz również spojrzeć na http: // stackoverflow. com/questions/2132657/java-swing-architecture-problem/2132670 # 2132670 ................. Właściwie wszyscy zaproponowali mi zastosowanie architektury MVC z swing ... ale ja nie chcę tej odpowiedzi .... już to wiem ... Chcę sugestii lub przykładowego przykładu huśtawki, która ma swój kod GUI podzielony na kilka plików ... tak, że mogę wymyślić mój własny problem .. często wyszukiwałam google, ale nie mogłam dostać takiego przykładu ... –

7

Można użyć klasy FileOutputStream:

FileOutputStream fos = new FileOutputStream("image.jpg"); 
try { 
    fos.write(someByteArray); 
} 
finally { 
    fos.close(); 
} 
3

Można użyć ImageIO API.

Szczegóły mogą być nieco owłosione, ale najpierw prawdopodobnie będziesz chciał utworzyć obraz BufferedImage, używając TYPE_BYTE_INDEXED typu i odpowiedniej instancji IndexColorModel. Następnie umieść tam tablicę bajtów. Podpowiedź: możesz uzyskać wewnętrzną reprezentację BufferedImage z:

myDataBuffer = myBufferedImage.getRaster().getDataBuffer(); 

który prawdopodobnie powrotu bufor danych typu DataBufferByte (sprawdź!), Z której można uzyskać tablicę bajtów z

myByteArray = ((DataBufferByte) myDataBuffer).getData(); 

Następnie możesz użyć System.arraycopy, aby skopiować na to tablicę bajtów.

Powiązane problemy