Obrzky podporuj balky java applet java awt image
Obrázky podporují balíčky: • java. applet • java. awt ~. image ~. renderable • javax. swing • javax. imageio ~. event ~. metadata ~. plugins. jpeg ~. spi ~. stream ~. plugins. bmp ( od verze 1. 5 ) Obrázky jsou zakódované soubory pixelů uložené lokálně či na síti, často dosti rozsáhlé a v různých formátech. Podporují se formáty: GIF, PNG, JPEG, BMP, WBMP, . ( Pozor na ztrátové. ) Jejich stahování, zpracování, vykreslení ( rendering ) či zápis je náročné. Programátor nemá přímý přístup k obrazové paměti. Využívá se multithreadová a proudová taktika. Obrázky a zvuky jsou bezpečné objekty, neb nemohou počítač narušit. PJV 12 1
java. awt. image Image. Observer Image. Consumer Image. Producer java. awt Component Renderable. Image Pixel Filtered Filter Grabber Image. Source Buffered Memory Image. Filter Image. Source Filter Renderable Image. Op Contextual. Rendered Image. Factory java. awt Crop. Image RGBImage Filter Runnable javax. swing Gray. Filter ~. renderable Renderable Image. Producer Replicate Area. Averaging Scale. Filter ~. renderable Renderable. Image ~. renderable Renderable Image. Op PJV 12 2
java. awt. image java. awt Raster. Op Image Volatile Image Band Multi. Pixel. Packed Buffered Combine. Op Sample. Model Image Affine Single. Pixel. Packed Transform. Op Sample. Model Color Component Convert. Op Sample. Model java. awt Transparency Color. Model Sample Model Writable. Rendered. Image Convolve. Op Component Lookup. Op Color. Model Banded Sample. Model Pixel. Interleaved Sample. Model Index Rescale. Op Color. Model PJV 12 Packed Direct Color. Model Buffered. Image. Op 3
java. awt. image Raster Tile. Observer Kernel Writable Raster Buffer Strategy Data Buffer Lookup Table PJV 12 Data. Buffer Byte Int Byte. Lookup Data. Buffer Table Float Double Short. Lookup Data. Buffer Table Short UShort 4
javax. imageio Image. IO Image. Trancoder IIOParam. Controller Image Writer IIOImage Reader IIOParam ~. plugins. jpeg Image JPEGImage Read. Param Image JPEG Write. Param Huffman. Table JPEGQT BMPImage Write. Param PJV 12 5
ja ageio. stream java. io Data. Input Data. Output IIOByte Buffer Image Input. Stream Output. Stream Image. Input Stream. Impl PJV 12 Image. Output Stream. Impl File. Image Input. Sream Output. Sream File. Cache. Image Input. Sream Output. Sream Memory. Cache Image. Input. Sream Image. Output. Sream 6
Příklad vykreslení obrázku v aplikaci public class Image. Load extends Frame { Toolkit tk = Toolkit. get. Default. Toolkit( ); Image img 1 = tk. get. Image( "C: \. . . \im 1. gif" ); Image img 2 = tk. get. Image( new URL( "http: \. . . \im 2. jpeg" ) ); int x 1=…, y 1=…, x 2=…, y 2=…, w 2=…, h 2=… ; public Image. Load( ) throws Exception { Media. Tracker mt = new Media. Tracker( this ); mt. add. Image( img 1, 123 ); // unique id is also priority mt. add. Image( img 2, 456 ); // unique id is also priority mt. wait. For. All( ); this. set. Bounds( 100, 200, 200 ); this. set. Visible( true ); } public void paint( Graphics g ) { g. draw. Image( img 1, x 1, y 1, this ); // this odkazuje na Observer g. draw. Image( img 2, x 2, y 2, w 2, h 2, this ); } } PJV 12 7
Interfejs java. awt. Observer. gif. jpg Tool. Kit . png tk. get. Image( string / url ) Image bit 128 32 64 16 2 4 8 1 flags ABORT – zrušeno před dokončením ALLBITS – úspěšně dokončeno ERROR & ABORT – chyba a zrušení FRAMEBITS – část dokončena HEIGHT – výška již známa PROPERTIES – vlastnosti již známy SOMEBITS – potřebny další bity WIDTH – šířka již známa void g. draw. Image( im, . . . , observer ) notification @override boolean image. Update( im, flags, x, y, w, h ) { Ta je konkrétní již v java. awt. Component. PJV 12 . . } 8
Image vs. pole pixelů Application get. Image( ) (Component) this Media. Tracker create. Image( ) Applet get. Image( ) Image. Producer Memory int [ width*height ] Image. Source Image. Consumer height Image Pixel get. Source( ) width Grabber 0 – transparent 255 - opaque prod PJV 12 grab. Pixels( ) A R G B cons 9
Image Producer, Consumer, Filter Applet ap; Toolkit tk; Image im; Image. Producer prod; Image. Consumer cons; Image. Filter filter; int pix[ ] = new int[ w * h ]; // pole ARGB im = ( (Component) this ). create. Image( prod ); im = ap. get. Image( url ); im = tk. get. Image( url ); // vytvoření image // získání v apletu // získání v aplikaci prod = im. get. Source( ); prod = new Filtered. Image. Source( prod, filter ); prod = new Memory. Image. Source( w, h, pix, off, scan ); Pixel. Grabber pg = new Pixel. Grabber( im, x, y, w, h, pix, off, scan ); boolean b = pg. grab. Pixels(); // spuštění filter = new Crop. Image. Filter( x, y, w, h ); filter = new My. RGBFilter(. . . ); PJV 12 // potomek RGBFilteru 10
Filtrování Image im 0 = … ; Image. Producer prod 0 = im 0. get. Source( ); Image. Filter filter 1 = new Crop. Image. Filter( 50, 100, 100 ); Image. Producer prod 1 = new Filtered. Image. Source( prod 0, filter 1 ); Image. Filter filter 2 = new My. RGBFilter(. . . ); Image. Producer prod 2 = new Filtered. Image. Source( prod 1, filter 2 ); Image im 2 = this. create. Image( prod 2 ); // na objektu typu Component class My. RGBFilter extends RGBImage. Filter { int another. RGB; public My. RGBFilter(. . . ) {. . . } public int filter. RGB( int x, int y, int rgb ) {. . . return another. RGB; } } PJV 12 11
Zápis a načtení obrázku import java. awt. image. *; import javax. imageio. *; import java. io. *; Buffered. Image im = new Buffered. Image( w, h, Buffered. Image. TYPE_INT_RGB ) ; Graphics g = im. get. Graphics( ); g. fill. XXX… ; g. set. Color… ; g. draw. XXX… ; // create some graphics boolean b = Image. IO. write( im, "gif", new File( "pic 123. gif" ) ); System. out. println( b ); … Image im 2 = Image. IO. read( new File( "pic 123. gif" ) ); PJV 12 12
Čtení, úprava a zápis obrázku import java. awt. *; import java. awt. image. *; import java. io. *; import javax. imageio. *; class Read. Modify. Write { public static void main( String[ ] args ) { Image im 1 = Image. IO. read( new File( " …. gif " ) ); int w = im 1. get. Width( null ), h = im 1. get. Height( null ); // read int [ ] pix = new int [ w*h ]; Pixel. Grabber pg = new Pixel. Grabber( im 1, 0, 0, w, h, pix, 0, w ); pg. grab. Pixels( ); change( pix, w ); // modify pixel array somehow Buffered. Image im 2= new Buffered. Image( w, h, Buffered. Image. TYPE_INT_RGB ); for ( int i = 0; i < pix. length; i++ ) im 2. set. RGB( i % w, i / w, pix[ i ] ); boolean b = Image. IO. write( im 2, "jpg", new File ( " …. gif " ) ); // write }} PJV 12 13
Natažení obrázku Image. Icon Obrázky mohou být jak externí, tak i součástí aplikace ( které se dostanou automaticky do classes resp. jar). import javax. swing. *; import javax. awt. *; Image. Icon ic = new Image. Icon("C: / …. gif ", "description" ); // příp. URL Image img = ic. get. Image( ); // např. pro Graphics JButton b = new JButton( ); // příklad použití b. set. Icon( ic ); b. set. Vertical. Text. Position( Swing. Constants. BOTTOM ); b. set. Text( ic. get. Description( ) ); PJV 12 14
Rovinná geometrie Geometrie v awt je příliš jednoduchá - jen s hodnotami typu int. Balíčky java. awt. geom a java. awt umožňují hodnoty float a double pomocí dvojice statických tříd. Float a. Double vnořených ( nested ) v abstraktních třídách Point 2 D, Line 2 D, Rectangle 2 D atd. Výpočet probíhá v typu double, typ float je jen pro úsporu paměti a času. K vykreslení slouží abstraktní třída Graphics 2 D, jež přetypováním se získá např. takto: Rectangle 2 D r = new Rectangle 2 D. Double( x, y, w, h ); public void paint( Graphics g ) { Graphics 2 D g 2 = ( Graphics 2 D ) g; g 2. draw( r ); } PJV 12 15
java. awt. geom & java. awt Affine Graphics Rectangular Shape Transform Graphics 2 D Line 2 D Point 2 D Quad Curve 2 D Shape Area Arc 2 D D/F D/F Polygon Ellipse 2 D D/F Cubic Curve 2 D Point Round Rectangle 2 D D/F Dimension 2 D javax. swing. plaf UIResource D/F 1. 6 Path 2 D Path. Iterator Rectangle 2 D D/F javax. swing. plaf Dimension UIResouce General. Path Flattening Path. Iterator Rectangle extends Path 2 D. Float java. awt. PJV 12 D/F - static nested classes. Double /. Float ~ dva vnoření konkrétní potomci 16
Interfejs Shape ( útvar ) Obecně definuje metody geometrického útvaru : - boolean contains(. . . ) – obsahuje bod či obdélník ? - Rectangle get. Bounds(. . . ) – omezující obdélník. - Path. Iterator get. Path. Iterator(. . . ) – získání iterátoru. - boolean intersects( Rectangle 2 D r ) – existuje průnik s obdélníkem ? Pro posouzení vnitřku se implicitně Shape chápe jako Area. PJV 12 17
Finální třída General. Path umožňuje vytvořit obecnou, orientovanou křivku ( a to i nesouvislou ) z lineárních, kvadratických, kubických ( Bézierových ) a segmentů typu Shape, tj. různých útvaru a obrazců. Dále umožňuje: - void append( Path. Iterator pi, boolean connect ) – přidání segment; . - void append( Shape s, boolean connect ) – přidání útvaru. - void close. Path() - křivku uzavřít. - boolean contains(. . . ) – zjistit zda obsahuje bod či obdélník. - Rectangle get. Bounds(. . . ) – omezující obdélník. - boolean intersects( Rectangle 2 D r ) – zjistit průnik s obdélníkem. - int get. Winding. Rule( ) – zjištění zavíjecího pravidla. - void set. Winding. Rule( int wr ) - nastavení zavíjecího pravidla: WIND_EVEN_ODD nebo WIND_NON_ZERO. - void move. To( double x, double y ) - přesun. - void line. To( double x, double y ) – přidání lineárního segmentu. - void transform( Affine. Transform at ) – afinní transformace. PJV 12 18
Winding rules čili zavíjecí pravidla WIND_NON_ZERO Uvnitř: právě tehdy nerovná-li se počet polopřímky průsečíků zleva počtu průsečíků zprava. PJV 12 WIND_EVEN_ODD Uvnitř: právě tehdy je-li počet polopřímky průsečíků lichý. 19
Další třídy • Point 2 D • Line 2 D - vzdálenost dvou bodů. - intersekce s úsečkou a obdélníkem, - vzdálenost bodu od úsečky a přímky. • Rectangle 2 D - vytváření minimálního rámce pro bod a obdélník, - test zda je bod či obdélník uvnitř, - kde v okolí je bod, - intersekce s úsečkou. • Ellipse 2 D - test zda je bod či obdélník uvnitř, - test na průnik s obdélníkem. • Arc 2 D - test zda je bod či obdélník uvnitř, - test na průnik s obdélníkem. • Area - sjednocení a intersekce oblastí, - sčítání a odčítání oblastí, - test zda je bod či obdélník uvnitř. - afinní transformace. - test na singularitu, polygonalitu, rektangularitu. PJV 12 20
Path. Iterator a Flattening. Path. Iterator Interfejs Path. Iterator umožňuje získat obrys objektů typu Shape a procházet ho po segmentech. • int current. Segment(. . . ) – vrátí charakteristiky a typ segmentu SEG_. . . • typy segmentů jsou int static final SEG_CLOSE=0, SEG_MOVETO=0, SEG_LINETO=1, SEG_QUADTO=2, SEG_CUBICTO=3. • int get. Winding. Rule( ) – vrací hodnotu zavíjecího pravidla: 0 - WIND_EVEN_ODD constant. 1 - WIND_NON_ZERO constant. • boolean is. Done( ) – konec iterace • void next( ) - další krok Konkrétní třída Flattening. Path. Iterator implementuje Path. Iterator, avšak zplošťuje nelineární segmenty tak, že je vydává jen jako řadu lineárních. PJV 12 21
Afinní transformace Třída Affine. Transform vytváří lineární transformátory 2 D souřadnic, které zachovávají úsečky, paralelitu a dělící poměry. Transformace lze konkatenovat, pre-konkatenovat a invertovat. Transformovat lze body, pole bodů, pole souřadnic a objekty splňující interfejs Shape. Posun ( translation ), škálování ( scaling ), překlopení ( flip ), rotace ( rotation ) a úkos ( shear ) se vyjadřují jedinou matici: x’ y’ 1 = m 00 m 01 m 02 m 10 m 11 m 12 0 0 1 x * y 1 m 00 x+m 01 y+m 02 = m 10 x+m 11 y+m 12 1 m 02, m 12 - translace m 00, m 11 - scaling, překlopení m 00, m 01, m 10, m 11 – rotace PJV 12 22
Transformace Translation: 1 0 tx 0 1 ty 0 0 1 Rotation: cos( fi ) -sin( fi ) cos( fi ) 0 0 Scaling: sx 0 0 sy 0 0 Shear: 1 shx shy 1 0 0 PJV 12 0 0 1 (1, 0, 0, 1, tx, ty) tx, ty>0 right and down 0 0 1 (cos, sin, -sin, cos, 0, 0) fi > 0 clockwise (radian) (sx, 0, 0, sy, 0, 0) sx, sy>1 greater negative / flip (1, shy, shx, 1, 0, 0) 23
Třída java. awt. geom. Affine. Transform Počátek souřadnic je levý horní roh komponenty – leč osa y je převrácená – je to překlopený první kvadrant a tedy rotace pro úhel > 0 je ve směru hodinových ručiček. Řada konstruktorů a metod usnadňuje definici a změny transformační matice: void translate(. . . ) void set. To. Translate(. . . ) at=get. Translate. Instance(. . . ) void rotate(. . . ) void set. To. Rotate(. . . ) at=get. Rotate. Instance(. . . ) void scale(. . . ) void set. To. Scale(. . . ) at=get. Scale. Instance(. . . ) void shear(. . . ) void set. To. Shear(. . . ) at=get. Shear. Instance(. . . ) Affine. Transform create. Inverse( ) void concatenate( Affine. Transform at ) void pre. Concatenate( Affine. Transform at ) K provedení transformace slouží metody: void transform(. . . ) void delta. Transform(. . . ) - transformace bez translační složky void inverse. Transform(. . . ) – zpětná transformace Shape create. Transformed. Shape( Shape s ) PJV 12 24
Příklad rotace double x= , y= , w= , h= , fi= ; // all values are positive Rectangle 2 D. Double r = new Rectangle 2 D. Double( x, y, w, h ); Area a = new Area( r ); Affine. Transform t = new Affine. Transform( ); a. transform( t. get. Rotate. Instance( fi, x, y ) ); public void paint( Graphics g ) { Graphics 2 D g 2= ( Graphics 2 D ) g; g 2. fill( r ); g 2. set. Color( Color. RED ); g 2. fill( a ); } PJV 12 // x, y. . . centre of rotation 0, 0 y x w fi h 25
- Slides: 25