Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
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. PJV12
2
java.awt.image Component ImageObserver ImageConsumer ImageProducer
Filter Pixel Grabber Filtered ImageSource Buffered ImageFilter Memory ImageSource RenderableImage java.awt CropImage Filter Runnable javax.swing Renderable ImageOp RGBImage Filter GrayFilter ~.renderable Renderable ImageProducer Replicate ScaleFilter AreaAveraging ScaleFilter ~.renderable ContextualRendered ImageFactory RenderableImage lRendered ImageFactory ~.renderable Renderable ImageOp PJV12
3
WritableRenderedImage
java.awt.image Sample Model java.awt RasterOp Image Band CombineOp MultiPixelPacked SampleModel Volatile Image Buffered Image Affine TransformOp SinglePixelPacked SampleModel java.awt Transparency WritableRenderedImage Color ConvertOp Component SampleModel ColorModel RenderedImage ConvolveOp Banded SampleModel Component ColorModel LookupOp PixelInterleaved SampleModel Index ColorModel RescaleOp Packed ColorModel Direct ColorModel BufferedImageOp PJV12
4
java.awt.image Raster Kernel Buffer Strategy Data Buffer Lookup Table
TileObserver Kernel Writable Raster Buffer Strategy Data Buffer Lookup Table DataBuffer Byte DataBuffer Int ByteLookup Table DataBuffer Float DataBuffer Double ShortLookup Table DataBuffer Short DataBuffer UShort PJV12
5
javax.imageio ImageIO IIOImage Image Reader Image Writer IIOParam
ImageTrancoder IIOParamController ImageIO Image Reader Image Writer IIOImage IIOParam ~.plugins.jpeg Image ReadParam JPEGImage ReadParam JPEGQT Image WriteParam JPEGImage WriteParam JPEG HuffmanTable BMPImage WriteParam PJV12
6
javax.imageio.stream DataInput DataOutput IIOByte Buffer ImageInput
java.io java.io DataInput DataOutput IIOByte Buffer Image InputStream Image OutputStream ImageInput StreamImpl ImageOutput StreamImpl FileImage InputSream FileImage OutputSream FileCacheImage InputSream FileCacheImage OutputSream MemoryCache ImageInputSream MemoryCache ImageOutputSream PJV12
7
Příklad vykreslení obrázku v aplikaci
public class ImageLoad extends Frame { Toolkit tk = Toolkit.getDefaultToolkit( ); Image img1 = tk.getImage( "C:\\...\\im1.gif" ); Image img2 = tk.getImage( new URL( " ) ); int x1=…, y1=…, x2=…, y2=…, w2=…, h2=… ; public ImageLoad( ) throws Exception { MediaTracker mt = new MediaTracker( this ); mt.addImage( img1, 123 ); // unique id is also priority mt.addImage( img2, 456 ); // unique id is also priority mt.waitForAll( ); this.setBounds( 100, 100, 200, 200 ); this.setVisible( true ); } public void paint( Graphics g ) { g.drawImage( img1, x1, y1, this ); // this odkazuje na Observer g.drawImage( img2, x2, y2, w2, h2, this ); PJV12
8
Interfejs java.awt.Observer
ToolKit .gif .jpg .png bit flags ABORT – zrušeno před dokončením ALLBITS – úspěšně dokončeno ERROR & ABORT – chyba a zrušení FRAMEBITS – část dokončena 2 HEIGHT – výška již známa 4 PROPERTIES – vlastnosti již známy 8 SOMEBITS – potřebny další bity 1 WIDTH – šířka již známa tk.getImage( string / url ) Image void g.drawImage( im, ... , observer ) notification @override boolean imageUpdate( im, flags, x, y, w, h ) { .... Ta je konkrétní již v java.awt.Component. } PJV12
9
Image vs. pole pixelů Application Applet Memory ImageSource Pixel
getImage( ) MediaTracker (Component) this createImage( ) Applet getImage( ) ImageProducer Memory ImageSource int [ width*height ] ImageConsumer Pixel Grabber grabPixels( ) Image height getSource( ) width 0 – transparent 255 - opaque A R G B prod cons PJV12
10
Image Producer, Consumer, Filter
Applet ap; Toolkit tk; Image im; ImageProducer prod; ImageConsumer cons; ImageFilter filter; int pix[ ] = new int[ w * h ]; // pole ARGB im = ( (Component) this ).createImage( prod ); // vytvoření image im = ap.getImage( url ); // získání v apletu im = tk.getImage( url ); // získání v aplikaci prod = im.getSource( ); prod = new FilteredImageSource( prod, filter ); prod = new MemoryImageSource( w, h, pix, off, scan ); PixelGrabber pg = new PixelGrabber( im, x, y, w, h, pix, off, scan ); boolean b = pg.grabPixels(); // spuštění filter = new CropImageFilter( x, y, w, h ); filter = new MyRGBFilter( ... ); // potomek RGBFilteru PJV12
11
Filtrování Image im0 = … ; ImageProducer prod0 = im0.getSource( );
ImageFilter filter1 = new CropImageFilter( 50, 50, 100, 100 ); ImageProducer prod1 = new FilteredImageSource( prod0, filter1 ); ImageFilter filter2 = new MyRGBFilter( ... ); ImageProducer prod2 = new FilteredImageSource( prod1, filter2 ); Image im2 = this.createImage( prod2 ); // na objektu typu Component class MyRGBFilter extends RGBImageFilter { int anotherRGB; public MyRGBFilter( ... ) { ... } public int filterRGB( int x, int y, int rgb ) { ... return anotherRGB; } PJV12
12
Zápis a načtení obrázku
import java.awt.image.*; import javax.imageio.*; import java.io.*; BufferedImage im = new BufferedImage( w, h, BufferedImage.TYPE_INT_RGB ) ; Graphics g = im.getGraphics( ); g.fillXXX… ; // create some graphics g.setColor… ; g.drawXXX… ; boolean b = ImageIO.write( im, "gif", new File( "pic123.gif" ) ); System.out.println( b ); … Image im2 = ImageIO.read( new File( "pic123.gif" ) ); PJV12
13
Čtení, úprava a zápis obrázku
import java.awt.*; import java.awt.image.*; import java.io.*; import javax.imageio.*; class ReadModifyWrite { public static void main( String[ ] args ) { Image im1 = ImageIO.read( new File( " … .gif " ) ); // read int w = im1.getWidth( null ), h = im1.getHeight( null ); int [ ] pix = new int [ w*h ]; PixelGrabber pg = new PixelGrabber( im1, 0, 0, w, h, pix, 0, w ); pg.grabPixels( ); change( pix, w ); // modify pixel array somehow BufferedImage im2= new BufferedImage( w, h, BufferedImage.TYPE_INT_RGB ); for ( int i = 0; i < pix.length; i++ ) im2.setRGB( i % w, i / w, pix[ i ] ); boolean b = ImageIO.write( im2, "jpg", new File ( " … .gif " ) ); // write }} PJV12
14
Natažení obrázku ImageIcon
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.*; ImageIcon ic = new ImageIcon("C:/ … .gif ", "description" ); // příp. URL Image img = ic.getImage( ); // např. pro Graphics JButton b = new JButton( ); // příklad použití b.setIcon( ic ); b. setVerticalTextPosition( SwingConstants.BOTTOM ); b.setText( ic. getDescription( ) ); PJV12
15
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 Point2D, Line2D, Rectangle2D 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 Graphics2D, jež přetypováním se získá např. takto: Rectangle2D r = new Rectangle2D.Double( x, y, w, h ); public void paint( Graphics g ) { Graphics2D g2 = ( Graphics2D ) g; g2.draw( r ); } PJV12
16
java.awt.geom & java.awt Area Point Graphics Shape Shape Line2D
Affine Transform Rectangular Shape Shape Graphics 2D Line2D Area Arc2D D/F D/F Point2D Quad Curve2D Polygon Ellipse2D D/F D/F D/F Point Cubic Curve2D Round Rectangle2D D/F D/F javax.swing.plaf 1.6 Dimension 2D Path2D Rectangle2D UIResource PathIterator D/F D/F javax.swing.plaf Dimension Dimension UIResouce GeneralPath Flattening PathIterator Rectangle extends Path2D.Float java.awt. D/F - static nested classes .Double / .Float ~ dva vnoření konkrétní potomci PJV12
17
Interfejs Shape ( útvar )
Obecně definuje metody geometrického útvaru : boolean contains( ... ) – obsahuje bod či obdélník ? Rectangle getBounds( ... ) – omezující obdélník. PathIterator getPathIterator( ... ) – získání iterátoru. boolean intersects( Rectangle2D r ) – existuje průnik s obdélníkem ? Pro posouzení vnitřku se implicitně Shape chápe jako Area. PJV12
18
Finální třída GeneralPath
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( PathIterator pi, boolean connect ) – přidání segment;. void append( Shape s, boolean connect ) – přidání útvaru. void closePath() - křivku uzavřít. boolean contains( ... ) – zjistit zda obsahuje bod či obdélník. Rectangle getBounds( ... ) – omezující obdélník. boolean intersects( Rectangle2D r ) – zjistit průnik s obdélníkem. int getWindingRule( ) – zjištění zavíjecího pravidla. void setWindingRule( int wr ) - nastavení zavíjecího pravidla: WIND_EVEN_ODD nebo WIND_NON_ZERO. void moveTo( double x, double y ) - přesun. void lineTo( double x, double y ) – přidání lineárního segmentu. void transform( AffineTransform at ) – afinní transformace. PJV12
19
Winding rules čili zavíjecí pravidla
WIND_NON_ZERO WIND_EVEN_ODD Uvnitř: právě tehdy nerovná-li se počet polopřímky průsečíků zleva počtu průsečíků zprava. Uvnitř: právě tehdy je-li počet polopřímky průsečíků lichý. PJV12
20
Další třídy Point2D - vzdálenost dvou bodů.
Line2D intersekce s úsečkou a obdélníkem, - vzdálenost bodu od úsečky a přímky. Rectangle2D - 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. Ellipse2D test zda je bod či obdélník uvnitř, - test na průnik s obdélníkem. Arc2D test zda je bod či obdélník uvnitř, 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. PJV12
21
PathIterator a FlatteningPathIterator
Interfejs PathIterator umožňuje získat obrys objektů typu Shape a procházet ho po segmentech. int currentSegment( ... ) – 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 getWindingRule( ) – vrací hodnotu zavíjecího pravidla: WIND_EVEN_ODD constant. WIND_NON_ZERO constant. boolean isDone( ) – konec iterace void next( ) - další krok Konkrétní třída FlatteningPathIterator implementuje PathIterator, avšak zplošťuje nelineární segmenty tak, že je vydává jen jako řadu lineárních. PJV12
22
Afinní transformace Třída AffineTransform vytváří lineární transformátory 2D 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’ m00 m01 m x m00x+m01y+m02 y’ = m10 m11 m * y = m10x+m11y+m12 m02, m translace m00, m scaling, překlopení m00, m01, m10, m11 – rotace PJV12
23
Transformace (1, 0, 0, 1, tx, ty) tx, ty>0 right and down
Translation: tx ty (1, 0, 0, 1, tx, ty) tx, ty>0 right and down Rotation: cos( fi ) -sin( fi ) 0 sin( fi ) cos( fi ) 0 (cos, sin, -sin, cos, 0, 0) fi > 0 clockwise (radian) Scaling: sx sy (sx, 0, 0, sy, 0, 0) sx, sy>1 greater negative / flip Shear: 1 shx shy (1, shy, shx, 1, 0, 0) PJV12
24
Třída java.awt.geomAffineTransform
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 setToTranslate( ... ) at=getTranslateInstance( ... ) void rotate( ... ) void setToRotate( ... ) at=getRotateInstance( ... ) void scale( ... ) void setToScale( ... ) at=getScaleInstance( ... ) void shear( ... ) void setToShear( ... ) at=getShearInstance( ... ) AffineTransform createInverse( ) void concatenate( AffineTransform at ) void preConcatenate( AffineTransform at ) K provedení transformace slouží metody: void transform( ... ) void deltaTransform( ... ) - transformace bez translační složky void inverseTransform( ... ) – zpětná transformace Shape createTransformedShape( Shape s ) PJV12
25
Příklad rotace double x= , y= , w= , h= , fi= ; // all values are positive Rectangle2D.Double r = new Rectangle2D.Double( x, y, w, h ); Area a = new Area( r ); AffineTransform t = new AffineTransform( ); a.transform( t.getRotateInstance( fi, x, y ) ); // x, y ... centre of rotation public void paint( Graphics g ) { Graphics2D g2= ( Graphics2D ) g; g2.fill( r ); g2.setColor( Color.RED ); g2.fill( a ); } 0,0 y x w f i h PJV12
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.