[grafika]Wczytywanie obrazu do tablicy dwuwymiarowej

0

Witam, serdecznie mam taki o to problem z wczytaniem obrazka do tablicy dwuwymiarowej, ktora pozniej bede przeksztalcal. Blad pewnie trywialny ale za nic nie moge go dostrzec

File plik = new File("C:\\obrazek1.jpg");
	BufferedImage obrazek = ImageIO.read(plik);

	int x=obrazek.getWidth();
	int y=obrazek.getHeight();
	int[][]tab_pix=new int[x+1][y+1];
	
	//-----TABLICOWANIE-----------------------------------
	for(int i=1; i<x;i++)
	{
		for(int j=1; j<y;j++){
			tab_pix[x][y]=obrazek.getRGB(x,y);
		}
	}
	//---------------------------------------------------

Dostaje takie o to bledy:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
	at sun.awt.image.ByteInterleavedRaster.getDataElements(Unknown Source)
	at java.awt.image.BufferedImage.getRGB(Unknown Source)
	at zadanie1.main(zadanie1.java:28)
0

O co tu chodzi

tab_pix[x][y]=obrazek.getRGB(x,y);

?
Chyba ma być tak:

tab_pix[i][j]=obrazek.getRGB(i,j);

Komunikat o błędzie wynika stąd, że jeśli szerokość obrazka wynosi x (w pikslach), to wartości piksli zmieniają się od 0 do x-1. Nie ma piksla o współrzędnych (x,y).

0

to jak napisac petle aby wczytalo sie do tablicy poprawnie wszystkie pixele pokolei tak jak chcialbym

0

Po mojemu tak:

        int[][]tab_pix=new int[x][y];
       
        //-----TABLICOWANIE-----------------------------------  
        for(int i=0; i<x;i++)
        {
                for(int j=0; j<y;j++){
                        tab_pix[i][j]=obrazek.getRGB(i,j);
                }
        }
0

jasne glupi blad :(tak to jest jak czlowiek nie spi po nocach

0

Podepnę się pod temat.
Mając tak wczytany obraz jak operować na konkretnych danych R,G,B czy ma to wyglądać mniej więcej tak?

int c=foto.getPixel(x,y);
int r=(c & 0cff0000) >> 16;
int g=(c & 0x00ff00)>> 8;
int b=(c & 0x0000ff);

i wtedy wykonywać operację na zmiennych i z powrotem zapisać za pomocą putPixel(x,y) ?

Mógł by ktoś pokazać jakiś przykład np. zwiększający jasność.

0

Mniej więcej tak pomijając literówkę 0c zamiast 0x. Zwiększenie jasności, to powiększenie każdej ze składowej o tę samą wartość, przy czym bez zaburzania koloru jest to możliwe tylko do momentu gdy powiększona najwyższa wartość dowolnej składowej nie przekroczy 255 (do tej wartości trzeba obcinać składowe). W trybie 32-bitowym ostatnią składową jest jeszcze składowa przezroczystości zaczynająca się od bitu nr 23 (licząc je od 0).
Po zmianie wartości musisz je z powrotem zakodować, co akurat jest łatwe bo są to zwyczajne operacje OR z przesunięciami w odwrotną stronę. Niektóre operacje graficzne są sporo łatwiejsze i bardziej intuicyjne na modelu HSL, do którego warto przekodować piksel (a potem ponownie zakodować w RGB).

0

Dzięki za odpowiedź. Akurat przeźroczystość nie jest mi potrzebna więc omijam to :)
A mógł byś bardziej opisać to konwertowanie na ten drugi typ?

0

Najprościej jak odpalisz wiki lub googla bo tam jest to dobrze opisane.
http://pl.wikipedia.org/wiki/Przestrze%C5%84_barw
Możesz użyć dowolnego modelu jaki okaże się łatwiejszy do wykonania operacji. Oczywiście musisz sam ocenić czy koszt konwersji w obie strony jest tego warty. Ewentualnie możesz w ogóle zdecydować się na przechowywanie kolorów w modelu jaki będzie najbardziej przydatny i konwertować go do RGB tylko w celu wyświetlenia na ekranie/drukarce/naświetlarce.

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