Konwersja tablicy byte na Obrazek w Java

0
BufferedImage Obrazek = new BufferedImage(300, 300, BufferedImage.TYPE_3BYTE_BGR);
		File flPlik = new File("Obrazek.bmp");
		try {
			Obrazek = ImageIO.read(flPlik);
		} catch (IOException e) {

			e.printStackTrace();
		}

		WritableRaster raster = Obrazek.getRaster();
		DataBufferByte buffor = (DataBufferByte) raster.getDataBuffer();
		byte tablicaByte[] = buffor.getData(); 

Zamieniłem obrazek wczytany z dysku na tablicę byte i nie wiem jak odwrócić ten proces. Proszę o informacje jak zamienić tą tablice tablicaByte z powrotem na obrazek tak by można było go zapisać na dysku pod inną nazwą.

I przy okazji spytam. Można jakoś w obiekcie Obrazek na podstawie wczytanego pliku ustawić odpowiedni bufor tak by nie wpisywać za każdym razem ręcznie wysokości i szerokości obrazka? Bo u mnie jest ustawione ręcznie na 300. A chciałbym by automatycznie był ustawiany pod każdy obrazek.

0

Ja nie chce zerżnąć gotowca z internetu tylko sam pisać by chociaż trochę coś się nauczyć. Wzbogaciłem o kawałek kodu z tego linku program.

		BufferedImage Obrazek = new BufferedImage(300, 300,
				BufferedImage.TYPE_3BYTE_BGR);
		File flPlik = new File("C:\\Obrazek.bmp");
		try {
			Obrazek = ImageIO.read(flPlik);

			WritableRaster raster = Obrazek.getRaster();
			DataBufferByte buffor = (DataBufferByte) raster.getDataBuffer();
			byte tablicaByte[] = buffor.getData();

			InputStream in = new ByteArrayInputStream(tablicaByte);
			BufferedImage bImageFromConvert = ImageIO.read(in);

			ImageIO.write(bImageFromConvert, "bmp", new File(
					"c:\\new-darksouls.bmp"));

		} catch (IOException e) {

			e.printStackTrace();
		}

No i błąd jest w linii

ImageIO.write(bImageFromConvert, "bmp", new File("c:\\new-darksouls.bmp"))

Mianowicie:

"Exception in thread "main" java.lang.IllegalArgumentException: image == null!
	at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)
	at javax.imageio.ImageIO.getWriter(Unknown Source)
	at javax.imageio.ImageIO.write(Unknown Source)"

Proszę o pomoc.

dodanie znaczników <code> i <code class="java"> - furious programming

0

Masz ważne powody by z obrazka tworzyc tablice bajtów? Bardziej naturalna jest tablica intów, każdy element tablicy to składowe R,G,B oraz przezroczystość piksela. Łatwo wtedy przerabiać obrazek.

0
bogdans napisał(a):

Masz ważne powody by z obrazka tworzyc tablice bajtów?

Nie wiem czy mam. Ale tak nie jest optymalnej? Int rezerwuje 32 bity. Natomiast byte 8 bitów. Co prawda składowe RGB są wartościami od 0 do 255, a byte w javie ma od -128 do 127. Jednak branie do tej roboty typu int nie jest marnotrawstwem pamięci, bo każda liczba potrzebuje 32 bity? Jeśli jestem w błędzie to proszę o poprawę.

1

Jakie marnotrawstwo? Do zapamiętania pełnej informacji o kolorze jednego piksela potrzebujesz przecież 32 bity (4 bajty). Jeden int pamięta wszystko: składowe RGB i przezroczystość. Odczytanie można zrobić tak:

BufferedImage img = ImageIO.read(...);
width = img.getWidth();
height = img.getHeight();
int[] pixels=new int[width*height];
pg = new PixelGrabber(img,0,0,width,height,pixels,0,width);
try
{
     pg.grabPixels();
}
catch(Exception e)
{
     ....
 }
0
bogdans napisał(a):

Jakie marnotrawstwo? Do zapamiętania koloru jednego piksela potrzebujesz 32 bity (4 bajty). Jeden int pamięta wszystko: składowe RGB i przezroczystość.

Aha no teraz już rozumiem. Bo ja z początku myślałem, że mówisz by zapisywać jedną składową na jednym int. Wartość R ma swojego inta, G swojego itd.
A teraz już wiem, że Tobie chodzi o zapisanie 4 składowych koloru na jednym int. I potem przez odpowiednie maski 0xFF, operator & i >> dobieramy się do tych kolorów jak by zaszła taka potrzeba, prawda?

Bo ten IllegalArgumentException mi wywalał dlatego, że te wartości byte były ujemne, prawda?

Powiedz jeszcze proszę które miejsca w tym drugim kodzie byś zmienił i jakich funkcji czy obiektów użył.

1 użytkowników online, w tym zalogowanych: 0, gości: 1