Java 2D. dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com



Podobne dokumenty
Programowanie Multimediów. Programowanie Multimediów JAVA. grafika w JAVA 2D API [1]

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Rysowanie prostych obiektów graficznych przy użyciu biblioteki AWT (Abstract Window Toolkit)

Laboratorium z informatyki sem. III/ćw. 2 Wydział Transportu PW /19 MATERIAŁY POMOCNICZE DO ĆWICZENIA 2

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

4. W konstruktorze klasy Grafika wywołaj metodę określającą rozmiary ramki oraz ustaw kolor tła metodą setbackground():

Podstawy Swing. Tomasz Borzyszkowski

Grafika i komunikacja człowiek komputer Laboratorium. Część 2: Graphics

Programowanie obiektowe

WIZUALIZACJA INFORMACJI TEKSTOWEJ WSTĘP DO HTML 5 CANVAS

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

Kurs Adobe Photoshop Elements 11

Multimedia i interfejsy. Ćwiczenie 5 HTML5

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

Księgarnia PWN: Andrzej Jaskulski - AutoCAD 2010/LT Podstawy projektowania parametrycznego i nieparametrycznego

Maskowanie i selekcja

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Java. Wykład 9. Piotr Tronczyk

7. Dynamiczne generowanie grafiki

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Opis Edytora postaci Logomocji

1. Kształty, w których można tworzyć dowolne kształty geometryczne jako kombinacje linii prostych, krzywych, prostokątów, elips i łuków.

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

FORMATY PLIKÓW GRAFICZNYCH

Obsługa programu Paint materiały szkoleniowe

Programowanie komputerów Wykład 6: Aplety Java

Grafika i komunikacja człowiek komputer Laboratorium. Część 3: Tekst, czcionki, kolory

GIMP Grafika rastrowa (Ćwiczenia cz. 2)

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podstawy Processingu. Diana Domańska. Uniwersytet Śląski

GRAFIKA. Rodzaje grafiki i odpowiadające im edytory

CorelDRAW. wprowadzenie

Język Java. Rysowanie GUI Określanie wyglądu komponentów

Wstęp do JUNG. Omówione elementy wykorzystane w Edge Color Project

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Spis treści CZĘŚĆ I. NIEPARAMETRYCZNE PROJEKTOWANIE 2D...31

Obsługa programu Paint. mgr Katarzyna Paliwoda

Projektowanie graficzne. Wykład 2. Open Office Draw

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Wstawianie elementów w edytorze symboli oraz edytorze widoku aparatów

Grafika Komputerowa Wybrane definicje. Katedra Informatyki i Metod Komputerowych Uniwersytet Pedagogiczny im. KEN w Krakowie apw@up.krakow.

Podstawy i języki programowania

Grafika w aplikacjach lp. Jak zmienić kolor tła?

GRAFIKA KOMPUTEROWA I TWORZENIE STRON WWW

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

GRAFIKA RASTROWA. WYKŁAD 1 Wprowadzenie do grafiki rastrowej. Jacek Wiślicki Katedra Informatyki Stosowanej

Kurs WWW. Paweł Rajba.

Corel Draw, Adobe Illustrator grafika wektorowa

Microsoft Small Basic

Szybkie tworzenie grafiki w GcIde

Ćwiczenie 1 Automatyczna animacja ruchu

Dziedziczenie. Zadanie 1

Formaty plików graficznych

Doskonalimy Rysowanie Kartka Bożonarodzeniowa

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Rysowanie punktów na powierzchni graficznej

Inkscape. Menu. 1 SVG (ang. Scalable Vector Graphics) uniwersalny format dwuwymiarowej, statycznej i

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Google Earth. Co to jest Google Earth? Co to jest KML? Skąd można pobrać Google Earth?

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Dokumentacja WebMaster ver 1.0

Zaawansowany kurs języka Python

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

STWORZENIE PRZYKŁADOWEJ

Szczegółowy program szkolenia:

Pokażę w jaki sposób można zrobić prostą grafikę programem GIMP. 1. Uruchom aplikację GIMP klikając w ikonę na pulpicie.

Corel Draw, Adobe Illustrator grafika wektorowa

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Pasek menu. Ustawienia drukowania

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

C Biblioteka G2. C.1 Koncepcja biblioteki G2.

Narzędzia programu Paint

Ćwiczenie 2 Warstwy i kształty podstawowe

SYLABUS ECCC MOD U Ł : C S M2 GR A F I K A KO M P U T E R O W A PO Z I O M: PO D S T A W O W Y (A)

4.6 OpenOffice Draw tworzenie ilustracji

INSTRUKCJA DO ĆWICZENIA 5

ECDL/ICDL CAD 2D Moduł S8 Sylabus - wersja 1.5

B Biblioteka GD. B.1 Koncepcja biblioteki GD.

Zajęcia prowadzi trener posiadający certyfikat Adobe Expert in Photoshop oraz Adobe Expert in Illustrator.

ECDL/ICDL Edycja obrazów Moduł S4 Sylabus - wersja 2.0

1 Zrozumieć Flasha... 1 Co można zrobić za pomocą Flasha?... 2 Tworzenie obrazków do strony 3 Animowanie witryny 4 Tworzenie filmów

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Przewodnik po obszarze roboczym

Grafika rastrowa (bitmapa)-

Tworzenie elementów graficznych

Multimedia JAVA. Historia

Plan wykładu. Wprowadzenie Program graficzny GIMP Edycja i retusz zdjęć Podsumowanie. informatyka +

GRAFIKA WEKTOROWA. WYKŁAD 1 Wprowadzenie do grafiki wektorowej. Jacek Wiślicki Katedra Informatyki Stosowanej

Rozdział 6 Grafika i multimedia w Javie

1. Przypisy, indeks i spisy.

ZAZNACZENIA. Zaznaczenia (inaczej maski) służą do zaznaczania obszarów rysunku.

Tworzenie prostych obrazów wektorowych w programie CorelDRAW 12

Obsługa mapy przy użyciu narzędzi nawigacji

Programowanie obiektowe

Ćwiczenia z systemu operacyjnego WINDOWS

Transkrypt:

Java 2D dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com

Wprowadzenie Java 2D API umożliwia pracę z obrazami, tekstem i grafiką jako rozszerzenie AWT Zakres dostarczanej funkcjonalności: ujednolicony model renderingu dla różnych rodzajów wyświetlaczy i drukarek (user space) duży zbiór różnych podstawowych kształtów geometrycznych takich jak: prostokąty, krzywe, elipsy jak i również mechanizm do renderowania dowolnych kształtów. mechanizm dla wykrywania kliknięć na kształtach, tekście i obrazkach sterowanie sposobem renderowania zachodzących na siebie obiektów zarządzanie kolorami wsparcie dla wydruków złożonych dokumentów sterowanie jakością renderowanych obiektów (anty-aliasing)

Układ współrzędnych Java 2D rozróżnia dwa układy współrzędnych Przestrzeń użytkownika (user space) miejsce, w którym obiekty są specyfikowane Przestrzeń urządzeń (device space) układ współrzędnych związanych z urządzeniem, na którym ma zostać wyświetlona wyspecyfikowana grafika np. monitor, drukarka, Typem dla x i y jest integer. Wspierany jest również float i double. (0,0) x y Przy transformacji przestrzeni użytkownika do przestrzeni urządzenia punktem odniesienia jest lewy górny róg. Wartości x, y rosną odpowiednio w dół i w prawo

Java 2D rendering Java udostępnia wspólny mechanizm modelowania grafiki dla różnych urządzeń W przypadku konieczności wyświetlenia/wykreślenia danego kształtu wywoływane są automatycznie metody paint() lub update() z kontekstem graficznym Graphics. Metody te zawiera każdy obiekt rozszerzający Component. Pakiet java.awt.graphics2d oferuje następujące możliwości: rysowanie podstawowych kształtów geometrycznych z uwzględnieniem krawędzi (metody draw) wypełnianie kształtów kolorem lub określonym wzorem (metody fill) rysowanie tekstu (drawstring). Określenie czcionki wskazuje w jaki sposób ma być danych tekst przekształcony w obiekt graficzny, który jest wypełniony kolorem lub wzorem rysowanie obrazków (metoda drawimage)

Metody wykorzystywane przy rysowaniu Metody do rysowania można podzielić na dwie grupy Metody definiujące kształt (metody draw, fill) Metody określające w jaki sposób ten kształt ma być narysowany zmiana atrybutów kontekstu (Graphics) W celu użycia dodatkowych funkcjonalności oferowanych przez Java 2D należy rzutować obiekt typu Graphics na Graphics2D public void paint (Graphics g) { Graphics2D g2 = (Graphics2D) g;... } Możliwość modyfikacji atrybutów związanych z określonym kontekstem modyfikacja szerokości linii/krawędzi rysunku zmiana sposobu łączenia linii/krawędzi przekształcanie rysunku: obracanie skalowanie lub przycinanie określanie koloru i wzoru wypełnienia kształtu określenie w jaki sposób obiekty są ze sobą skomponowane określanie czcionki definiowanie współczynnika jakość/wydajność (aliasing)

Java 2D public void paint(graphics g) { // ustawianie atrybutów pędzela g.setcolor(somecolor); g.setfont(somelimitedfont); // kreślenie kształtów g.drawstring( ); g.drawline( ) g.drawrect( ); // outline g.fillrect( ); // solid g.drawpolygon( ); // outline g.fillpolygon( ); // solid g.drawoval( ); // outline g.filloval( ); // solid //etc } public void paintcomponent(graphics g) { // czyszczenie obrazu super.paintcomponent(g); // rzutowanie kontekstu na konteskt Java2D Graphics2D g2d = (Graphics2D)g; // Set pen parameters g2d.setpaint(fillcolororpattern); g2d.setstroke(penthicknessorpattern); g2d.setcomposite(somealphacomposite); g2d.setfont(anyfont); g2d.translate( ); g2d.rotate( ); g2d.scale( ); g2d.shear( ); g2d.settransform(someaffinetransform); // definiowanie własnego kształtu SomeShape s = new SomeShape( ); // rysowanie kształtu g2d.draw(s); // outline g2d.fill(s); // solid }

Figury podstawowe - rysowanie Java 2D API udostępnia podstawowe kształty: linia, punkt, prostokąt, etc w pakiecie java.awt.geom Klasy reprezentujące kształty implementują interfejs Shape: pozwala opisać krzywą PathIterator: określa w jaki sposób są pobierane elementy krzywej. Należy uzyskać obiekt typu Graphics2D Każda funkcja wymaga zdefiniowana punktu zaczepienia np. java.awt.graphics.drawline(int x1, int y1, int x2, int y2). (x1, y1) początek linii, a (x2, y2) koniec linii. Jeśli chcemy narysować kształt z Java 2D możemy użyć funkcji draw g2.draw(new Line2D.Double(x1, y1, x2, y2)); lub Line2D.Float(float X1, float Y1, float X2, float Y2) ; lub Line2D.Float(Point2D p1, Point2D p2);

Figury podstawowe rysowanie c.d. Krzywe kwadratowe: QuadCurve2D Metoda setcurve pozwala na określenie dwóch punktów końcowych oraz punktu sterującego krzywą Krzywe sześcienne: CubicCurve2D Kawałek parametryzowanej krzywej sześciennej Metoda setcurve analogiczna do metody setcurve z krzywej kwadratowej poszerzona o drugi punkt kontrolny QuadCurve2D q = new QuadCurve2D.Float(); q.setcurve(0, 0, 200, 600, 400, 0); g2d.draw(q); CubicCurve2D q = new CubicCurve2D.Float(); q.setcurve(0, 0, 50, 50, 10,100, 400, 0); g2d.draw(q);

Figury podstawowe rysowanie c.d. Klasa Rectangle dziedziczy po RectangularShape i implementuje interfejs Shape oraz kilka dodatkowych metod pozwalających na określenie położenia, rozmiaru, środka, etc Klasa RoundRectangle definiuje prostokąt z zaokrąglonymi wierzchołkami. Do wyspecyfikowania prostokąta wymagane są: położenie, wysokość, szerokość, wartość wysokości kąta zaokrąglenia, wartość szerokości kąta zaokrąglenia g2.draw(new Rectangle2D.Double(x, y, rectwidth, rectheight)); g2.draw(new RoundRectangle2D.Double(x, y, rectwidth, rectheight, 10, 10));

Figury podstawowe rysowanie c.d. Elipsa krzywa zdefiniowana w typie Ellipse2d Do narysowania wymagana jest położenie oraz wysokość i szerokość Łuk część elipsy. Zdefiniowana w klasie Arc2D. Do opisania potrzebne jest: położenie, wysokość i szerokość prostokąta w który jest wpisana elipsa, początek i koniec kąta, typ zamknięcia. Typy zamknięcia: OPEN, PIE, CHORD g2.draw(new Ellipse2D.Double(x, y, rectwidth, rectheight)); g2.draw(new Arc2D.Double(x, y, rectwidth, rectheight, 90, 135, Arc2D.OPEN));

Własne kształty Do rysowania własnych kształtów została stworzona klasa GeneralPath. GeneralPath implementuje interfejs Shape i pozwala rysować krzywe, które złożone są z podstawowych kształtów: linie, krzywe sześcienne i kwadratowe, int x2points[] = {0, 90, 0, 90}; int y2points[] = {0, 40, 40, 0}; GeneralPath lamana = new GeneralPath(GeneralPath.WIND_EVEN_ODD, x2points.length); lamana.moveto (x2points[0], y2points[0]); for (int index = 1; index < x2points.length; index++) { lamana.lineto(x2points[index], y2points[index]); }; g2.draw(lamana); Metody do kształtowania GeneralPath moveto(float x, float y) przesuń aktualny punkt ścieżki do danego punktu lineto(float x, float y) dodaj kawałek linii do obecnej ścieżki quadto(float ctrlx, float ctrly, float x2, floaty2) dodaj krzywą sześcienną do aktualnej ścieżki. curveto(float ctrlx1, float ctrly1, float ctrlx2, float ctrly2, float x3, floaty3) dodaj krzywą sześcieną do aktualnej ścieżki closepath() zamknij aktualną ścieżkę.

Grubość, rodzaj krawędzi i wypełnienie Wygląd kształtów możemy modyfikować po przez: wypełnienie (filling) wypełnianie kształtu określonym kolorem, gradientem lub wzorem określanie krawędzi (stroking) krawędź może mieć grubość, kolor, styl Ażeby narysować kształty należy zmienić przed wywołaniem metody draw ustawienia kontekstu Graphics2D. Zaokrąglony prostokąt z przerywaną linią final static float przer1[] = {10.0f}; final static BasicStroke przer = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, przer1, 0.0f); g2.setstroke(przer); g2.draw(new RoundRectangle2D.Double(x, y, rectwidth, rectheight, 10, 10)); Gradient na elipsie czerwon2bialy = new GradientPaint(0,0, color.red,100, 0,color.WHITE); g2.setpaint(czerwony2bialy); g2.fill (new Ellipse2D.Double(0, 0, 100, 50));

Style linii Style linii są definiowane przez atrybut krawędzi dla danego kontekstu Graphics W celu ustawienia wybranego stylu linii należy utworzyć instancje BasicStroke i ustawić dla kontekstu Graphics za pomocą funkcji setstroke. Metoda draw narysuje kształt zgodnie z ustawioną definicją linii Właściwości stylu linii: Grubość linii Rodzaj połączenia linii: JOIN_BEVEL, JOIN_MITER, JOIN_ROUND Styl zakończenia linii: CAP_BUTT, CAP_ROUND, CAP_SQUARE Przerywanie linii.

Wzory wypełnienia Wzory wypełnienia są definiowane jako atrybut procesu malowania Wybranie wzoru wypełnienia wymaga utworzenia obiektu implementującego interfejs Paint oraz ustawienia go dla wybranego kontekstu graficznego Graphics za pomocą metody setpaint Trzy klasy implementują interfejs Paint: Color, GradientPaint określony przez punkt, w którym rozpoczyna się dany kolor oraz punkt, w którym kończy się dany kolor. TexturePaint definiowany przez BufferImage. Należy wskazać obraz oraz rozmiar prostokąta z obrazem, który będzie powielany

Praca z obrazami Obrazy są obiektami, które posiadają wysokość i szerokość oraz własny układ współrzędnych Możliwe akcje do wykonania na obrazach: Ładowanie zewnętrznych obrazów w formatach GIF, PNG, JPEG do wewnętrznej reprezentacji obrazu w Java 2D Bezpośrednie rysowanie zawartości obrazu na powierzchni przeznaczonej do rysowania Zapisywanie obrazów w plikach w następujących formatachgif, PNG, JPEG.

Klasy związane z obrazami java.awt.image jest to klasa bazowa dla pozostałych klas związanych z obrazami przechowująca informację o obrazie jako tablica pikseli java.awt.image.bufferdimage klasa dziedzicząca po Image umożliwiająca bezpośrednią pracę nad obrazem (np. ustawianie kolorów pikseli). Aplikacje mogą bezpośrednio tworzyć instancję tej klasy

Przeprowadzane operacje na obrazie realizowane są bezpośrednio w pamięci Udostępnia metody do przechowywania, interpretacji i uzyskiwania danych dotyczących pikseli Może być renderowany przez Graphics lub Graphcis2D Klasa BufferedImage

Ładowanie obrazu Java 2D umożliwia ładowanie obrazu z zewnętrznego formatu za pomocą Image I/O API. Image I/O API obsługuje następujące formaty: GIF, PNG, JPEG, BMP, WBMP Rozpoznanie typu kodowania obrazu realizowane jest automatycznie Wczytywanie obrazu może być realizowane również nie tylko z pliku, ale także ze strumienia danych Więcej informacji na temat Image I/O API: http://java.sun.com/j2se/1.4.2/docs/ guide/imageio/spec/imageio_guide TOC.fm.html Przykład wczytania obrazu BufferedImage img = null; try { img = ImageIO.read(new File("strawberry.jpg")); } catch (IOException e) {}

Rysowanie obrazów Do rysowania obrazów w danym położeniu służy funkcja: boolean Graphics.drawImage(Image img, int x, int y, ImageObserver observer); x, y określają pozycję obrazu observer informuje aplikację o fakcie załadowania obrazu w przypadku asynchronicznym. Nie jest wymagany dla BufferedImage Obraz jest rysowany 1:1 w przestrzeni użytkownika (user space) Przykład metody umożliwiającej rysowanie części obrazu, skalowanie oraz stosowanie filtrów: boolean Graphics.drawImage(Image img, int dstx1, int dsty1, int dstx2, int dsty2, int srcx1, int srcy1, int srcx2, int srcy2, ImageObserver observer); src reprezentuje obszar, który będzie skopiowany i odrysowany dst określają obszar, w którym będą przerysowane dane z src Rozmiary obrazka obliczane są analogicznie dla wysokości i szerokości w następujący sposób: srcx2-scrx1

Stosowanie filtrów Filtrowanie danego obrazka polega na utworzeniu nowego z użyciem pewnego algorytmu modyfikującego poszczególne piksele (np. modyfikacja kanału alpha, czyli przeźroczystości) void Graphics2D.drawImage( BufferedImage img, BufferedImageOp op, int x, int y) BufferedImageOp klasa implementująca określony filtr Przykładowe filtry: ConvolveOp. Każdy z wyjściowych pikseli jest obliczany z pośród go otaczających. Może być wykorzystany do rozmywania lub wyostrzania obrazów. AffineTransformp. Filtr ten mapuje piksele ze źródłowej pozycji do innego położenia docelowego dokonującą transformacji na lokalizacji pikseli LookupOp. Filtr dokonuje zamiany kolorów na podstawie dostarczonej tablicy kolorów. RescaleOp. Filtr mnoży wartości opisujące kolor przez ten sam współczynnik. Może być wykorzystany do rozjaśniania lub przyciemnia obrazu lub zmiany przeźroczystości.

Tworzenie i rysowanie obrazów Dowolny obraz może być utworzony z wykorzystaniem następujących konstruktorów: new BufferedImage(width, height, type) konstruuje BufferedImage dla wybranego predefiniowanego typu obrazu of new BufferedImage(width, height, type, colormodel) konstruuje BufferedImage dla wybranego typu obrazu: TYPE_BYTE_BINARY lub TYPE_BYTE_INDEXED. new BufferedImage(colorModel, raster, premultiplied, properties) konstruuje nowy BufferedImage z określonym Modelem Kolorów i Rastrem.

Podwójne buforowanie Obraz tworzony w pamięci może być wykorzystany do budowy mechanizmu podwójnego buforowania. Mechanizm podwójnego buforowania zmniejsza użycie zasobów dzięki czemu animacja jest płynna W tym przypadku przetworzenie obrazu realizowane w pamięci po czym obraz jest kopiowany na ekran Java 2D umożliwiających dostęp do mechanizmów przyśpieszających obróbkę obrazów w buforze: Metoda getcapabilities pozwala określić, czy wyświetlanie obrazu jest przyśpieszone (accelerated). Metoda setaccelerationpriority pozwala na ustawienie współczynnika określającego jak ważne jest przyśpieszenie wyświetlania danego obrazu Metoda getaccelerationpriority zwraca informacje na temat priorytetu przyśpieszenia wyświetlania obrazu.

Zapisywanie obrazów Zapisanie obrazu na dysku z BufferedImage z użyciem Image I/O API static boolean ImageIO.write(RenderedImage im, String formatname, File output) throws IOException Metoda ImageO.write woła plug-in dla danego typu obrazka, które nazwa przekazywana jest w parametrze formatname. Dzięki temu można łatwo rozszerzyć listę obsługiwanych formatów. Standardowo obsługiwane formaty: JPEG, PNG, GIF, BMP i WBMP Metoda String writernames[] = ImageIO.getWriterFormatNames(); zwraca listę wspieranych formatów przez JRE try { BufferedImage bi = getmyimage(); // zapisanie obrazu File outputfile = new File("saved.png"); ImageIO.write(bi, "png", outputfile); } catch (IOException e) { }