Šta je novo?

Pitanje u vezi zadatka iz jave

kenny_sp86

Slavan
Učlanjen(a)
02.12.2004
Poruke
511
Poena
320
Moja oprema  
CPU & Cooler
AMD Ryzen 7 7800X3D + Noctua NH-D15 Black
Matična ploča
MSI PRO X670-P WIFI
RAM
Kingston Fury Renegade 32GB DDR5 6400Mhz
GPU
Gigabyte Aorus Radeon 7900XTX 24GB
Storage
Samsung 980Pro 500GB + Samsung 990Pro 2TB
Zvuk
Logitech Z623
PSU
CoolerMaster MVE Gold V2 1050W
Kućište
Fractal Define 7 Compact
Monitor
LG 27UL500-W
Pristup internetu
  1. Kablovski internet
Pozdrav ljudi,
radim odr. zadatak iz jave kao vezbu.
U zadatku ucitavam 2 slike u kojoj je jedna obicna velika slika, a druga predstavlja logo sa belom pozadinom i potrebno je da od te druge napravim vodeni zig na prvoj, po sledecoj formuli:
Ako su vrednosti druge slike za RGB vece od 250 (smatramo da je belo) iscrtavamo piksel prve slike bez izmena, ako su vrednosti za RGB manje uzmimamo piksel prve slike i na R dodajemo 50, za G dodajemo 50, a B ostavljamo isto.
Moj problem je sto ne znam kako da pristupim pojedinim RGB vrednostima tog piksela. Ako pozovem slika.getRGB(x,y) (slika je tipa BufferedImage, (x,y) su koordinate) dobicu neku int vrednost, tj. Ne postoji posebno getBlue(), getRed(), GetGreen(), vec te funkcije postoje samo kad radim sa Color.
Moje pitanje je kako da pristupim posebnim komponentama boje tog piksela na slici, jer Color ne zeli da saradjuje sa tipom BufferedImage, tj. bar ja ne znam kako da ih ucinim kompatibilnim?

Ako neko ima bilo kakvu ideju, bicu vrlo zahvalan na istoj.
 
Prvi bajt tog integera je alfa kanal, drugi je R, treći je G, četvrti B.

Kod:
[FONT="Courier New"]
int pixelRGB 	= image.getRGB(x, y);

int pixelAlpha 	= (pixelRGB >> 24) & 0xff;
int pixelRed   	= (pixelRGB >> 16) & 0xff;
int pixelGreen 	= (pixelRGB >>  8) & 0xff;
int pixelBlue 	= (pixelRGB)       & 0xff;
[/FONT]
 
Poslednja izmena:
pa sta je ta int vrednost? potrazi negde sta vraca getRGB(). ja pogadjam da je ARGB il' tako nesto. gde je svaki bajt od cetiri u int-u vrednost za pojedinacni kanal. i gde bi A bila transparentnost...
i u tom slucaju dobijas ih AND-ovanjem i shitovanjem.

npr:

vraca ARGB = 0x1276C0A9 (hexadecimalno)
G = ARGB & 0x0000FF00 (AND da binarno svuda budu nule osim gde su kecevi za G deo)
G = G >> 8 (shift da smestis G u least significant [desni] bajt)

i eto ga G!

za ostale samo pomeras masku: 0x000000FF za B, 0x00FF0000 za R, 0xFF000000 za A.

u sustini bi trebalo da krenes od B sa 0x000000FF pa kad ga izvuces shiftujes masku u levo za 8, da bi mogao sve to u petlji da uradis.

ps. sintaksa je c-ovska, predpostavljam da je slicno u javi, ne secam se vise... :)

pps. ili da sve spojis kao zeleni zub iznad, cak i elegantnije bez siftovanja maske. :D
 
Poslednja izmena:
Hvala vam mnogo obojici. Sad znam kako da odradim. :)
 
Mala ispravka. Ovako bi trebalo da radi brže, pošto ima manje operacija šiftovanja (treba probati, možda se i primeti ubrzanje na velikom broju piksela):

Kod:
[FONT="Courier New"]
int pixelAlpha, pixelRed, pixelGreen, pixelBlue;
int pixelRGB	= image.getRGB(x, y);

pixelBlue	= pixelRGB & 0xFF;
pixelRGB     	= pixelRGB >> 8;
pixelGreen  	= pixelRGB & 0xFF;
pixelRGB     	= pixelRGB >> 8;
pixelRed     	= pixelRGB & 0xFF;
pixelRGB     	= pixelRGB >> 8;
pixelAlpha   	= pixelRGB & 0xFF;
[/FONT]
 
Poslednja izmena:
Hvala i na efikasnijem kodu. Svakako cu ga sacuvati. Bitno mi je da sam zavrsio zadatak i da mogu preci na sledeci.
 
Nazad
Vrh Dno