NazajNaprejKazalo

Java2D - Načini risanja v Javi2D


3.1 Razred Paint

Ko zapolnjujemo lik Shape, je uporabljena trenutna lastnost Paint objekta Graphics2D. To je lahko Color (enotna barva), GradientPaint(barvni prehod med dvema barvama) ali TexturePaint (tlakovanje s sliko). Z uporabo setPaint in getPaint lahko dobimo ali spremenimo nastavitve Paint. Nekaj glavnih Paint razredov:

3.2 Prosojnost

Prosojnost ni nastavljiva preko objekta Paint, ampak ločeno preko AlphaComposite objekta, ki se ga določi s setComposite. Glej poglavji 3.8 in 3.9.

3.3 Barvni prehodi: Primer programa

Izvorne datoteke: DrawExample2.java, DrawExample1.java, WindowUtil.java, ExitListener.java
import java.awt.*;



/** Primer barvnega prehoda v liku (Gradient fill)

 *  Java2D in Java 1.2.

 *  1998 Marty Hall, http://www.apl.jhu.edu/~hall/java/

 */



public class DrawExample2 extends DrawExample1 {

  private GradientPaint gradient =

    new GradientPaint(0.0F, 0.0F, Color.red, 175.0F,

                      175.0F, Color.yellow, true);



  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D)g;

    g2d.clearRect(0, 0, getSize().width, getSize().height);

    drawFilledCircle(g2d);

  }



  protected void drawFilledCircle(Graphics2D g2d) {

    g2d.setPaint(gradient);

    g2d.fill(getCircle());

    g2d.setPaint(Color.black);

    g2d.draw(getCircle());

  }



  public static void main(String[] args) {

    WindowUtil.openInJFrame(new DrawExample2(),380, 400);

  }

}

3.4 Barvni prehodi: Izgled izpisa

Output: risanje likov v Javi2D

3.5 Ponavljajoče slike kot vzorci za zapolnjevanje likov (Image tiling)

Za uporabo tlakovanja, je treba najprej tvoriti objekt TexturePaint in določiti njegovo uporabo preko metode setPaint (pod Graphics2D), podobno kot pri enotnih barvah in barvnih prehodih. Konstruktor TexturePaint sprejme BufferedImage in Rectangle2D kot argumenta. BufferedImage določa kaj naj riše, Rectangle2D pa kje naj se tlakovanje začne. Ustvariti BufferedImage je precej enostavno: po klicu konstruktorja BufferedImage s širino, višino in tipom BufferedImage.TYPE_INT_RGB kličemo še createGraphics, da dobimo Graphics2D, s katero rišemo. Malce težje je kreranje BufferedImage iz že narejene datoteke. Najprej naložimo Image iz slikovne datoteke, uporabimo MediaTracker, da zagotovi, da je nalaganje končano, potem kreiramo prazno BufferedImage s širino in višino željene slike kot argumentoma in narišemo Image v BufferedImage.

3.6 Tlakovanje slik: Primer programa

Uporabljene datoteke: TiledImages.java, ImageUtil.java, WindowUtil.java, ExitListener.java,

TiledImages.java

import com.sun.java.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;

/** An example of using TexturePaint to fill objects
 *  with tiled images. Uses the getBufferedImage
 *  method of ImageUtil to load an Image from a file
 *  and then turn that into a BufferedImage.
 *  1998 Marty Hall, http://www.apl.jhu.edu/~hall/java/
 */

public class TiledImages extends JPanel {

  private String dir = System.getProperty("user.dir");

  private String imageFile1 = dir + "/images/marty.jpg";

  private TexturePaint imagePaint1;

  private Rectangle2D.Double imageRect;

  private String imageFile2 =  dir + "/images/bluedrop.gif";

  private TexturePaint imagePaint2;

  private int[] xPoints = { 30, 700, 400 };

  private int[] yPoints = { 30, 30, 600 };

  private Polygon imageTriangle = new Polygon(xPoints, yPoints, 3);



  public TiledImages() {

    BufferedImage image = ImageUtil.getBufferedImage(imageFile1, this);

    imageRect = new Rectangle2D.Double(235, 70, image.getWidth(), image.getHeight());

    imagePaint1 = new TexturePaint(image, imageRect);

    image =  ImageUtil.getBufferedImage(imageFile2, this);

    imagePaint2 = new TexturePaint(image, new Rectangle(0, 0, 32, 32));

  }



  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D)g;

    g2d.clearRect(0, 0, getSize().width, getSize().height);

    g2d.setPaint(imagePaint2);

    g2d.fill(imageTriangle);

    g2d.setPaint(Color.blue);

    g2d.setStroke(new BasicStroke(5));

    g2d.draw(imageTriangle);

    g2d.setPaint(imagePaint1);

    g2d.fill(imageRect);

    g2d.setPaint(Color.black);

    g2d.draw(imageRect);

  }



  public static void main(String[] args) {

    WindowUtil.openInJFrame(new TiledImages(),750, 650);

  }

}

ImageUtil.java

import java.awt.*;
import java.awt.image.*;



/** A class that simplifies a few common image
 *  operations, in particular creating a BufferedImage
 *  from an Image file, and using MediaTracker to
 *  wait until an image or several images are done
 *  loading.
 *  1998 Marty Hall, http://www.apl.jhu.edu/~hall/java/
 */



public class ImageUtil {

  /** Create an Image from a file, then turn that into a BufferedImage.*/

  public static BufferedImage getBufferedImage(String imageFile, Component c) {

    Image image = c.getToolkit().getImage(imageFile);

    waitForImage(image, c);

    BufferedImage bufferedImage = new BufferedImage(image.getWidth(c),

                        image.getHeight(c),

                        BufferedImage.TYPE_INT_RGB);

    Graphics2D g2d = bufferedImage.createGraphics();

    g2d.drawImage(image, 0, 0, c);

    return(bufferedImage);

  }



  /** Take an Image associated with a file, and
   *  wait until it is done loading. Just a
   *  simple application of MediaTracker. If you
   *  are loading multiple images, don't use this
   *  consecutive times, instead use the version
   *  that takes an array of images.
   */



  public static boolean waitForImage(Image image, Component c) {

    MediaTracker tracker = new MediaTracker(c);

    tracker.addImage(image, 0);

    try {

      tracker.waitForAll();

    } catch(InterruptedException ie) {}

    if (tracker.isErrorAny())

      return(false);

    else

      return(true);

  }



  /** Take some Images associated with files, and
   *  wait until they are done loading. Just a
   *  simple application of MediaTracker.
   */



  public static boolean waitForImages(Image[] images, Component c) {

    MediaTracker tracker = new MediaTracker(c);

    for(int i=0; i<images.length; i++)

      tracker.addImage(images[i], 0);

    try {

      tracker.waitForAll();

    } catch(InterruptedException ie) {}

    if (tracker.isErrorAny())

      return(false);

    else

      return(true);

  }

}

3.7 Tlakovane slike kot vzorci za zapolnjevanje likov: primer izpisa

Izpis: tlakovane slike kot vzorci za zapolnjevanje likov v Javi2D

3.8 Prosojnost: Pregled

Prosojnost nastavimo tako, da najprej kreiramo objekt AlphaComposite in ga pošljemo metodi setComposite objekta Graphics2D. AlphaComposite element naredimo tako, da kličemo AlphaComposite.getInstance z določilom za mešanje in vrednostjo prosojnosti ("alpha" value). Vgrajenih je 8 mešalnih pravil (glej AlphaComposite API za podrobnosti), vendar je običajno uporabljena nastavitev AlphaComposite.SRC_OVER. Alpha vrednosti so od 0.0f (popolnoma prosojno) do 1.0f (popolnoma neporosojno).

3.9 Prosojnost: Primer programa

Uporabljene datoteke: Transparencies.java, WindowUtil.java in ExitListener.java
import com.sun.java.swing.*;
import java.awt.*;
import java.awt.geom.*;



public class Transparencies extends JPanel {

  private static double gap=10, width=60, offset=20,

                        deltaX=gap+width+offset;

  private Rectangle2D.Double

    blueSquare = new Rectangle2D.Double(gap+offset, gap+offset,

                             width, width),

    redSquare = new Rectangle2D.Double(gap, gap, width, width);



  private AlphaComposite makeComposite(float alpha) {

    int type = AlphaComposite.SRC_OVER;

    return(AlphaComposite.getInstance(type, alpha));

  }



  private void drawSquares(Graphics2D g2d,

                           float alpha) {

    Composite originalComposite = g2d.getComposite();

    g2d.setPaint(Color.blue);

    g2d.fill(blueSquare);

    g2d.setComposite(makeComposite(alpha));

    g2d.setPaint(Color.red);

    g2d.fill(redSquare);

    g2d.setComposite(originalComposite);

  }



  public void paintComponent(Graphics g) {

    Graphics2D g2d = (Graphics2D)g;

    g2d.clearRect(0, 0, getSize().width, getSize().height);

    for(int i=0; i<11; i++) {

      drawSquares(g2d, i*0.1f);

      g2d.translate(deltaX, 0);

    }

  }



  public static void main(String[] args) {

    String title = "Transparency test: alpha of " +

                   "the red square ranges from " +

                   "0.0 at the left to 1.0 at " +

                   "the right.";

    WindowUtil.openInJFrame(new Transparencies(),

                            (int)(11*deltaX + 2*gap),

                            (int)(deltaX + 3*gap),

                            title,

                            Color.lightGray);

  }

}

3.10 Prosojnost: Izgled izpisa

Izpis: prosojnost barv v Javi2D

NazajNaprejKazalo

avtor: Filip Božič
december, 1998