39
Programowanie Multimediów Programowanie Multimediów [1] JAVA JAVA grafika w JAVA 2D API grafika w JAVA 2D API

JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[1]

JAVAJAVAgrafika w JAVA 2D APIgrafika w JAVA 2D API

Page 2: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[2]

Java2D API w sposób znaczny rozszerza możliwości graficzne AWT. Po pierwsze umożliwia zarządzanie i rysowanie elementów graficznych o współrzędnych zmiennoprzecinkowych (float i double). Własność ta jest niezwykle przydatna dla różnych aplikacji m.in.:➲dla aplikacji w medycynie (wymiarowanie, planowanie terapii,

projektowanie implantów, itp.),➲grafice inżynierskiej,➲symulacji procesów fizycznych➲Itp...

Ta podstawowa zmiana podejścia do rysowania obiektów graficznychi geometrycznych powoduje powstanie, nowych, licznych klas i metod.

WprowadzenieWprowadzenie

Page 3: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[3]

W sposób szczególny należy wyróżnić tutaj sposób rysowania nowych elementów. Odbywa się to poprzez zastosowanie jednej metody:

Graphics2D g2;

g2.draw(Shape s);

WprowadzenieWprowadzenie

Page 4: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[4]

Metoda draw umożliwia narysowanie dowolnego obiektu implementującego interfejs Shape (kształt). Przykładowo narysowanie linii o współrzędnych typu float można wykonać w następujący sposób:

Line2D linia = new Line2D.Float(20.0f,

10.0f, 100.0f, 10.0f); g2.draw(linia);

Line2D.Float(20.0f, 10.0f, 100.0f, 10.0f); g2.draw(linia);

WprowadzenieWprowadzenie

Page 5: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[5]

Klasa Line2D implementuje interfejs Shape.Java2D wprowadza liczne klasy w ramach pakietu java.awt.geom, np:

Point2D Point2D.Double Point2D.Float QuadCurve2D.Double QuadCurve2D.Float Rectangle2D Rectangle2D.Double Rectangle2D.Float RoundRectangle2D.Double RoundRectangle2D.Float

Arc2D.Double Arc2D.Float CubicCurve2D.Double CubicCurve2D.Float Dimension2D Ellipse2D.Double Ellipse2D.Float GeneralPath Line2D Line2D.Double Line2D.Float

Page 6: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[6]

Charakterystyka JAVYCharakterystyka JAVY

W celu wykorzystania możliwości Java2D należy skon-struować obiekt graficzny typu Graphics2D. Ponieważ Graphics2D rozszerza klasę Graphics, to konstrukcja obiektu typu Graphics2D polega na rzutowaniu: Graphics2D g2 = (Graphics2D) g; gdzie g jest obiektem graficznym otrzymywanym dzięki AWT.

Uwaga! Argumentem metody paint komponentów jest obiekt klasy Graphics a nie Graphics2D.

Page 7: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[7]

Charakterystyka JAVYCharakterystyka JAVY

Dodatkowe klasy w AWT wspomagające grafikę to Ba-sicStroke oraz TexturePaint. Pierwsza z nich umoż-liwia stworzenie właściwości rysowanego obiektu takich jak np.: szerokość linii, typ linii.

Przykładowo ustawienie szerokości linii na 12 punktów odbywać się może poprzez zastosowanie następujące-go kodu: grubaLinia = new BasicStroke(12.0f); g2.setStroke(grubaLinia);Klasa TexturePaint umożliwia wypełnienie danego kształtu (Shape) określoną teksturą.

Page 8: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[8]

TexturePaintTexturePaint

public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);

Graphics2D big = bi.createGraphics(); big.setColor(Color.blue); big.fillRect(0, 0, 5, 5); big.setColor(Color.lightGray); big.fillOval(0, 0, 5, 5); Rectangle r = new Rectangle(0, 0, 5, 5); g2.setPaint(new TexturePaint(bi, r)); Rectangle rect = new Rectangle(5,5,200,200); g2.fill(rect);}

Page 9: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[9]

GradientPaintGradientPaint

int x = 5;int y = 7;GradientPaint redtowhite = new GradientPaint(x, y, Color.red, 200,

y,Color.blue);g2.setPaint(redtowhite);g2.fill(new RoundRectangle2D.Double(x, y, 200, 200, 10, 10));g2.setPaint(Color.black);g2.drawString("Filled RoundRectangle2D", x, 250);

Page 10: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[10]

Podstawowe możliwości graficznePodstawowe możliwości graficzne

Page 11: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[11]

GeneralPathGeneralPath

GeneralPath oddShape = new GeneralPath();...public GeneralPath createPath(int x, int y) { x2 = x; y2 = y; oddShape.moveTo(x, y); x -= 100; oddShape.lineTo(x, y); y += 50; oddShape.lineTo(x, y); x += 100; oddShape.lineTo(x, y); x += 10; y -= 10; x1 = x - 20; y1 = y - 20; oddShape.curveTo(x, y, x1, y1, x2, y2); return oddShape;}

Page 12: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[12]

Do dodatkowych zalet grafiki w Java2D należy zaliczyć m. in.:

➔ sterowanie jakością grafiki (np. antyaliasing, interpolacje)➔sterowanie przekształceniami geometrycznymi

(przekształcenia affiniczne - klasa AffineTransform),

➔sterowanie przeźroczystością elementów graficznych,➔bogate narzędzia do zarządzania czcionkami i rysowania

tekstu, ➔narzędzia do drukowania grafiki.

Page 13: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[13]

Przykładowa aplikacja ukazująca proste elementy grafiki w Java2D Rysunki2.java: import java.awt.event.*; import java.awt.geom.*; import java.awt.*; public class Rysunki2 extends Frame { Rysunki2 () {

super ("Rysunki2"); setSize(200, 220); }

public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g; Line2D linia = new Line2D.Float(20.0f, 20.0f, 180.0f, 20.0f); g2.draw(linia); BasicStroke grubaLinia = new BasicStroke(6.0f); g2.setStroke(grubaLinia); g2.setColor(Color.red); Line2D linia2 = new Line2D.Float(20.0f, 180.0f, 180.0f, 180.0f); g2.draw(linia2); g2.drawString ("Test grafiki",50, 100); g2.setColor(Color.black); }

public static void main (String [] args) { Frame f = new Rysunki2 (); f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){ System.out.println("Dziekujemy za prace z programem..."); System.exit(0); }

}); f.setVisible(true);

} } // koniec public class Rysunki2 extends Frame

Page 14: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[14]

Począwszy od pierwszych wersji w ramach AWT poprzez Java2D a skończywszy na najnowszej JAI (Java Advanced Imaging API - bardziej elastyczne definicje obrazów, bogate biblioteki narzędzi np. DFT) język JAVA dostarcza wiele narzędzi do tworzenia profesjonalnych systemów syntezy, przetwarzania, analizy i prezentacji obrazów.

ObrazyObrazy

AWT Java2D JAI

Page 15: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[15]

W początkowych wersjach bibliotek graficznych Javy podstawą pracy z obrazami była klasa java.awt.Image. Obiekty tej abstrakcyjnej klasy nadrzędnej uzyskiwane są w sposób zależny od urządzeń.

Podstawowa metoda zwracająca obiekt typu Image (klasa Image jest abstrakcyjna), często wykorzystywana w programach tworzonych w Javie to getImage().

Metoda ta dla aplikacji jest związana z klasą Toolkit, natomiast dla appletów z klasą Applet.

ObrazyObrazy

Page 16: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[16]

PrzykładyPrzykłady

Wywołanie metody getImage polega albo na podaniu ścieżki dostępu (jako String) lub lokalizatora URL do obrazu przechowywanego w formacie GIF lub JPEG. Przykładowo:

Image obraz = Toolkit.getDefaultToolkit.getImage("pic.gif");

- zwraca obiekt obraz na podstawie obrazu przechowywanego w pliku pic.gif w bieżącej ścieżce dostępu

Image obraz = Toolkit.getDefaultToolkit.getImage(new URL("http://www.wi.ps.pl/~user99/pic.gif");

- zwraca obiekt obraz na podstawie obrazu przechowywanego w pliku pic.gif na serwerze www.wi.ps.pl w danych podkatalogach.

Page 17: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[17]

Inną metodą uzyskania obiektu Image jest stworzenie obrazu poprzez wykorzystanie metody createImage().

Aby uzyskać obiekt typu Image za pomocą tej metody jako argument należy podać element implementujący interfejs ImageProducer.

Obiekt będący instancją klasy implementującej ten interfejs jest odpowiedzialny za stworzenie (produkcję) obrazu jaki jest związany z obiektem typu Image.

createImagecreateImage

ImageProducer CreateImage Image

Page 18: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[18]

Przykładowo w poprzednich metodach getImage() obiekt typu Image jest często zwracany wcześniej niż stworzony zostanie (np. załadowany z sieci) obraz. Wówczas metody odwołujące się do obiektu Image zwrócą błąd.

Dlatego obiekt typu ImageProducer informuje klientów (obserwatorów) o zakończonym procesie tworzenia obrazu związanego z obiektem typu Image.

ImageProducerImageProducer

Page 19: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[19]

Klientów stanowią obiekty klas implementujących interfejs ImageObserver, których zachowanie jest ukazane poprzez jedyną metodę imageUpdate().

Metoda ta zgodnie z informacją od obiektu ImageProducer żąda odrysowania elementu (np. komponentu graficznego jak np. panel, applet, itd. - java.awt.Component implementuje interfejs ImageObserver).

W czasie gdy ImageProducer wysyła informację o stanie do obiektu ImageObserver wysyła również dane do konsumenta czyli obiektu będącego wystąpieniem klasy implementującej interfejs ImageConsumer.

Klienci - ImageObserverKlienci - ImageObserver

Page 20: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[20]

Przykładowe klasy implementujące interfejs ImageConsumer tojava.awt.image.ImageFilter orazjava.awt.image.PixelGrabber.

Ponieważ do obiektu ImageConsumer dostarczane są wszystkie informacje związane z tworzonym obrazem (wymiary, piksele, model koloru) obiekt ten może za pomocą swoich metod wykonać wiele operacji na danych.

Przykładowo obiekty klasy ImageFilter umożliwiają wycinanie próbek, filtrację kolorów, itp.

natomiast obiekty klasy PixelGrabber umożliwiają pozyskanie części lub wszystkich próbkek z obrazu.

ImageConsumerImageConsumer

Page 21: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[21]

PixelGrabber pgObj =new PixelGrabber(rawImage, 0, 0, rawWidth,

rawHeight, pix,0,rawWidth);

// ---------------------------------------------if(pgObj.grabPixels() && ((pgObj.getStatus() & ImageObserver.ALLBITS) != 0))

{

for(int cnt = 0; cnt<(rawWidth*rawHeight);cnt++){ pix[cnt] = pix[cnt] & 0xC000FFFF; }

}

PixelGrabberPixelGrabber

Page 22: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[22]

Powracając do metody createImage(), której argumentem jest obiekt ImageProducer, umożliwia ona stworzenie (generację) obrazu na podstawie posiadanych danych.

Konieczne jest jednak stworzenie obiektu typu ImageProducer, będącego argumentem tej metody. W tym celu wykorzystuje się klasę implementującą interfejs ImageProducer – MemoryImageSource.

Klasa ta dostarcza szereg konstruktorów, którym podaje się: typ modelu kolorów (ColorModel) lub wykorzystuje się domyślny RGB, rozmiar tworzonego obrazu, wartości pikseli.

createImagecreateImage

Page 23: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[23]

Obraz.java: import java.awt.event.*; import java.awt.image.*; import java.awt.*; public class Obraz extends Frame { Image ob; Obraz () { super ("Obraz"); setSize(200, 220); ob=stworzObraz(); } public Image stworzObraz(){ int w = 100; //szerokość obrazu int h = 100; //wysokość obrazu int pix[] = new int[w * h]; //tablica wartości próbek int index = 0; //generacja przykładowego obrazu for (int y = 0; y < h; y++) { int red = (y * 255) / (h - 1); for (int x = 0; x < w; x++) { int blue = (x * 255) / (w - 1); pix[index++] = (255 << 24) | (red << 16) | blue; } } Image img = createImage(new MemoryImageSource(w, h, pix, 0, w)); //tworzony jest obraz w RGB o szerokości w, wysokości h, //na podstawie tablicy próbek pix, bez przesunięcia w tej tablicy z w elementami w linii return img; }

public void paint (Graphics g) { g.drawImage(ob,50,50,this); } public static void main (String [] args) { Frame f = new Obraz (); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.out.println("Dziekujemy za prace z programem..."); System.exit(0); } }); f.setVisible(true); } }//koniec public class Obraz extends Frame

W następujący sposób można wygenerować własny obiekt typu Image:

Page 24: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[24]

Mając obiekt typu Image można obraz z nim związany wyświetlić (narysować). W tym celu należy wykorzystać jedną z metod drawImage().

W najprostszej metodzie drawImage() podając jako argument obiekt typu Image, współrzędne x,y oraz obserwatora (ImageObserver, często w ciele klasy komponentu, w którym się rysuje odwołanie do obserwatora jest wskazaniem aktualnego obiektu komponentu - this) możemy wyświetlić obrazu w dozwolonym do tego elemencie.

Inna wersja metody drawImage() umożliwia skalowanie wyświetlanego obrazu poprzez podanie dodatkowych argumentów: szerokość (width) i wysokość (height).

Page 25: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[25]

Oprócz poznanych do tej pory operacji związanych z obrazami (stworzenie obiektu Image, filtracja danych, wyświetlenie i skalowanie) często wykorzystuje się dwie z kilku istniejących metod klasy Image, a mianowicie

Image.getWidth() oraz Image.getHeight().

Metody te umożliwiają poznanie wymiarów obrazu, co jest często niezwykle istotne z punktu widzenia ich wyświetlaniai przetwarzania.

Page 26: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[26]

Potok przetwarzania obrazu w JAVIE:

Page 27: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[27]

Java2D API rozszerza a zarazem zmienia koncepcję pracy z obrazami w Javie.

Podstawową klasą jest w tej koncepcji klasa BufferedImage, będącą rozszerzeniem klasy Image z dostępnym buforem danych.

Page 28: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[28]

Obiekt BufferedImage może być stworzony bezpośrednio w pamięci i użyty do przechowywania i przetwarzania danych obrazu uzyskanego z pliku lub poprzez URL.

Obraz BufferedImage może być wyświetlony poprzez użycie obiektów klasy Graphics2D.

Obiekt BufferedImage zawiera dwa istotne obiekty: obiekt danych - Raster oraz model kolorów ColorModel.

Klasa Raster umożliwia zarządzanie danymi obrazu. Na obiekt tej klasy składają się obiekty DataBuffer oraz SampleModel. DataBuffer stanowi macierz wartości próbek obrazu, natomiast SampleModel określa sposób interpretacji tych próbek.

Page 29: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[29]

Przykładowo dla danego piksela próbki (RGB) mogą być przechowywane w trzech różnych macierzach (banded interleaved) lub w jednej macierzy w formie przeplatanych próbek (pixel interleaved) dla różnych komponentów (R1,G1,B1,R2,G2,B2,...).

Rolą SampleModel jest określenie jakiej formy użyto do zapisu danych w macierzach. Najczęściej nie tworzy się bezpośrednio obiektu Raster lecz wykorzystuje się efekt działania obiektu BufferedImage, który rozbija Image na Raster oraz ColorModel.Niemniej istnieje możliwość stworzenia obiektu Raster poprzez stworzenie obiektu WritableRaster i podaniu go jako argumentu w jednym z konstruktorów klasy BufferedImage.

Page 30: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[30]

BufferedImage – przykładBufferedImage – przykładURL url = ... Image img = getToolkit().getImage(url);

try {

//pętla w której czekamy na skonczenie produkcji obrazu dla obiektu img MediaTracker mt = new MediaTracker(this); mt.addImage(img, 0); mt.waitForID(0); } catch (Exception e) {}

int iw = img.getWidth(this); int ih = img.getHeight(this); BufferedImage bi = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_RGB); //tworzymy obiekt BufferedImage Graphics2D g2 = bi.createGraphics(); //określamy kontekst graficzny dla obiektu g2.drawImage(img, 0, 0, this); //wrysowujemy obraz do bufora - wypełniamy DataBuffer obiektu BufferedImage

Page 31: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[31]

BufferedImage – przykładBufferedImage – przykład

public void paint(Graphics g)

{

if (getSize().width <= 0 || getSize().height <= 0) return;

Graphics2D g2 = (Graphics2D) g;

if (bi != null && isShowing())

{ g2.drawImage(bi, 0, 0, this); }

}

Page 32: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[32]

BufferedImage – predefiniowane typyBufferedImage – predefiniowane typy

• TYPE_3BYTE_BGR • TYPE_4BYTE_ABGR• TYPE_4BYTE_ABGR_PRE • TYPE_BYTE_BINARY • TYPE_BYTE_GRAY • TYPE_BYTE_INDEXED • TYPE_CUSTOM

• TYPE_INT_ARGB_PRE • TYPE_INT_ARGB • TYPE_INT_BGR • TYPE_INT_RGB • TYPE_USHORT_555_RGB • TYPE_USHORT_565_RGB • TYPE_INT_GRAY

Page 33: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[33]

Przetwarzanie obrazu w oparciu o BufferedImagePrzetwarzanie obrazu w oparciu o BufferedImage

Dla tak stworzonego obiektu BufferedImage można następ-nie przeprowadzić liczne korekcje graficzne, dodać elementy graficzne, zastosować metody przetwarzania obrazu oraz wy-świetlić obraz.Wyświetlenie obrazu obiektu BufferedImage odbywa się po-przez wykorzystanie metod drawImage() zdefiniowanych dla klasy Graphics2D(np. g2.drawImage(bi,null,null);).

Page 34: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[34]

Przetwarzanie obrazu w oparciu o BufferedImagePrzetwarzanie obrazu w oparciu o BufferedImageKorekcje graficzne i dodawanie elementów graficznych polega na ry-sowaniu w stworzonym kontekście graficznym dla obiektuBufferedImage.

Przetwarzanie obrazu odbywa się głównie poprzez wykorzystanie klas implementujących interfejs BufferedImageOp a mianowicie:

➔AffineTransformOp,➔BandCombineOp,➔ColorConvertOp,➔ConvolveOp,➔LookupOp,➔RescaleOp.

Page 35: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[35]

Filtracja obrazuFiltracja obrazu

Do najczęściej wykorzystywanych operacji należą:

- przekształcenia geometryczne sztywne (affiniczne) - aplikacja AffineTransformOp

- oraz operacje splotu - ConvolveOp

Te ostatnie wykorzystuje się do tworzenia filtrów cyfrowych, za pomocą których można zmieniać jakość obrazu oraz wykrywać elementy obrazu jak np. linie, punkty, itp.

Page 36: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[36]

Filtracja obrazuFiltracja obrazuPoniższy przykład ukazuje możliwość realizacji filtra cyfrowego oraz przykładową operację skalowania.

float[] SHARPEN3x3_3 = { 0.f, -1.f, 0.f, //maska filtru cyfrowego -1.f, 5.f, -1.f, 0.f, -1.f, 0.f};

BufferedImage bi=... AffineTransform at = new AffineTransform(); at.scale(2.0, 2.0); //określenie operacji geometrycznej-skalowanie wsp. 2 BufferedImageOp biop = null; BufferedImage bimg = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); // tworzymy nowy bufor Kernel kernel = new Kernel(3,3,SHARPEN3x3_3); //tworzymy kernel - jądro splotu ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); //definiujemy operację splotu z przepisywaniem wartości krawędzi cop.filter(bi,bimg); //wykonujemy operację splotu biop = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); //definiujemy operację skalowania i interpolacji obrazu

g2.drawImage(bimg,biop,x,y); //rysujemy skalowany obraz

Page 37: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[37]

Efekty brzegoweEfekty brzegowe

EDGE_ZERO_FILL - krawędzie obrazu decelo-wego są wypełniane wartością 0.

EDGE_NO_OP – piksele obrazu źródłowego leżące na jego krawędzi są kopiowane w odpowiednie miejsca obrazu docelowego bez jakichkolwiek modyfikacji.

Page 38: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[38]

Mapa kolorów (lookup table)Mapa kolorów (lookup table)

Poniższy przykład demonstruje zastosowanie mapy kolorów:

byte reverse[] = new byte[256];for (int j=0; j<200; j++){ reverse[j]=(byte)(256-j); }

ByteLookupTable blut=new ByteLookupTable(0, reverse); LookupOp lop = new LookupOp(blut, null); lop.filter(bi,bimg);

Page 39: JAVA - West Pomeranian University of Technologypforczmanski.zut.edu.pl/pm/05-java_2d_api.pdfProgramowanie Multimediów Programowanie Multimediów [5] Klasa Line2D implementuje interfejs

Programowanie Multimediów Programowanie Multimediów

[39]

Modyfikacja jasności/kontrastuModyfikacja jasności/kontrastu

Poniższy przykład demonstruje zastosowanie operatora RescaleOp:RescaleOp rop = new RescaleOp(1.5f, 1.0f, null); rop.filter(bi,bimg);