Einführung in 2D-Grafik in Java

Java unterstützt 2D Application Programming Interface, mit dem Sie 2D-Grafiken in sehr hoher Qualität erstellen können. Die Java 2D-API besteht aus Klassen mit vordefinierten Java-Funktionen oder -Methoden, mit denen der Programmierer die geometrische Transformation, die Bildverarbeitung, das Alpha-Compositing und viele andere erweiterte Grafikdesigns ausführen kann.

Die Java 2D-API ist Teil der Java 2-Plattform. Nachfolgend sind die Pakete aufgeführt, aus denen die 2D-API besteht:

  • awt
  • awt.image
  • awt.color
  • awt.font
  • awt.geom
  • awt.print
  • awt.image.renderable

Java 2D API erweitert das Abstract Windowing Toolkit (AWT) um zweidimensionale Grafik- und Bildgebungsfunktionen. Das Paket besteht aus einem umfassenden Framework zur Entwicklung einer umfangreichen Benutzeroberfläche, Zeichenprogrammen und Editoren für Bilder.

Mit Java 2D API erhalten Sie Unterstützung für die folgenden Funktionen:

  • Damit können Sie komplexe Dokumente ausdrucken.
  • Es bietet Farbmanagement mit einem erweiterten Satz von Farben.
  • Das Paket enthält eine breite Palette gebrauchsfertiger geometrischer Designs wie Kurven, Quadrate, Dreiecke und Rechtecke
  • Mit dem Paket können Sie jede Form auf sehr intuitive Weise rendern.
  • Um während des gesamten Entwurfsprozesses die gleiche Qualität beizubehalten, werden bei Bedarf Hinweise zum Rendern angezeigt

Bisher haben wir auf sehr hoher Ebene diskutiert, was eine 2D-API ist und was Sie mit dieser API erreichen können. Nun, da Sie einiges verstanden haben, wollen wir uns diesem Abschnitt widmen. Einer der wichtigsten Aspekte ist, dass Sie sich mit Java 2D Rendering nicht immer mit primitiven geometrischen Mustern befassen und Ihre geometrische Figur entwerfen müssen. Sehen wir uns also an, wie das Rendern in der 2D-API funktioniert.

Java 2D-Rendering

Java 2D API unterstützt ein einheitliches Rendering-Modell für alle Arten von Geräten, sei es ein Anzeigemonitor oder ein Drucker. Während der Entwicklung des Programms funktioniert das Rendern auf die gleiche Weise, unabhängig davon, ob es sich um einen Drucker oder einen Anzeigemonitor handelt. Das Paket erkennt und ändert den Grafikkontext automatisch basierend auf der Endkomponente. Die Java 2D-API besteht aus java.awt.Graphics2D, mit dem die Graphics-Klasse erweitert wird, um erweiterte Grafik- und Renderingfunktionen zu unterstützen.

Nachfolgend sind die Funktionen aufgeführt, die das Paket bietet:

  • Es unterstützt das Rendern von primitiven geometrischen Formen und Figuren.
  • Es bietet die Möglichkeit, das Innere einer beliebigen Form mit einer beliebigen Farbe oder einem Muster zu füllen, die bzw. das in den Malattributen unter Verwendung von Strichen angegeben ist.
  • Hiermit können Sie das angegebene Bild rendern.
  • Sie können die Textzeichenfolgen in Glyphen konvertieren, die mit den in den Malattributen angegebenen Farben gefüllt werden können.

Beispiel 1

Schauen wir uns dasselbe Java-Programm an und sehen, wie es funktioniert.

Code:

import javax.swing.JFrame;
import java.awt.*; // AWT package is responsible for creating GUI
import javax.swing.*; // Java swing package is responsible to provide UI components
// AWT class extents Jframe which is part of Swing package
public class AWTGraphicsSampleProgram extends JFrame (
/**
*
*/
// Defining all the static variables
private static final long serialVersionUID = 1L;
public static final int SAMPLE_CANVAS_WIDTH = 500;
public static final int SAMPLE_CANVAS_HEIGHT = 500;
// The program enters from the main method
public static void main(String() args) (
SwingUtilities.invokeLater(new Runnable() (
@Override
public void run() (
new AWTGraphicsSampleProgram(); // this run method will create a new object and thus invoke the constructor method.
)
));
)
//Here we are creating an instance of the drawing canvas inner class called DrawCanwas
private DrawCanvas sampleCanvas;
public AWTGraphicsSampleProgram() (
sampleCanvas = new DrawCanvas();
sampleCanvas.setPreferredSize(new Dimension(SAMPLE_CANVAS_WIDTH, SAMPLE_CANVAS_HEIGHT));
Container containerPane = getContentPane();
containerPane.add(sampleCanvas);
setDefaultCloseOperation(EXIT_ON_CLOSE); // setting up the default close mechanism
pack();
setTitle("……"); // set the desired title of the JFrame
setVisible(true); // setVisible method will be set the visibility of the Jframe to true
)
/**
* here drawCanvas is the inner class of the Jpanel which is used for custom drawing
*/
private class DrawCanvas extends JPanel (
/**
*
*/
private static final long serialVersionUID = 1L;
// Overriding paintComponent will let you to design your own painting
@Override
public void paintComponent(Graphics graphics) (
super.paintComponent(graphics);
setBackground(Color.BLACK); // setting the background color to black
graphics.setColor(Color.GREEN); // setting up the color to green
graphics.drawLine(30, 40, 100, 200);
graphics.drawOval(150, 180, 10, 10);
graphics.drawRect(200, 210, 20, 30);
graphics.setColor(Color.magenta);
graphics.fillOval(300, 310, 30, 50);
graphics.fillRect(400, 350, 60, 50);
graphics.setColor(Color.WHITE);
graphics.setFont(new Font("Monospaced", Font.PLAIN, 12)); // setting up the font style and font size
graphics.drawString("Java Graphics in 2D …", 10, 20);
)
)
)

Ausgabe:

Die Grafikklasse bietet verschiedene Methoden zum Zeichnen verschiedener grafischer Objekte. Die häufigsten Methoden sind drawString (), drawImage () und fillXxx (). Diese Methoden können grob in zwei Kategorien unterteilt werden. Die erste Art der Grafikmethode ist, dass sie Funktionen zum Zeichnen und Füllen bietet, mit denen Benutzer die grundlegenden Formen, Texte und Bilder rendern können. Die andere Methode ist für Attributeinstellungen vorgesehen, mit denen Sie den Effekt der Darstellung der Zeichnung in der Konsole ändern können. Mit Methoden wie setColor und setFont können Sie entscheiden, wie das Zeichnen und Füllen dargestellt wird. Der Grafikkontext ist dafür verantwortlich, den Status oder die Attribute beizubehalten, z. B. die aktuelle Malfarbe und die aktuelle Schriftart.

Beispiel # 2

Schauen wir uns ein weiteres Beispiel an, was wir mit Java 2D-Klassen noch erreichen können.

Code:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
public class GeometricShapes extends JFrame
(
/**
*
*/
private static final long serialVersionUID = 1L;
@SuppressWarnings("deprecation")
public GeometricShapes()
(
super( "Geometric shapes" );
setSize( 425, 160 );
show();
)
public static void main( String args() )
(
GeometricShapes figure = new GeometricShapes();
figure.addWindowListener( new WindowAdapter()
(
public void windowclosing( WindowEvent e )
(
System.exit( 0 );
)
));
)
public void paint( Graphics graphics )
(
// Instantiating Graphics 2D class
Graphics2D graphics2D = ( Graphics2D ) graphics;
graphics2D.setPaint( new GradientPaint( 16, 30,
Color.red,
45, 105,
Color.green,
true ) );
graphics2D.fill( new Ellipse2D.Double( 6, 31, 61, 105 ) );
graphics2D.setPaint( Color.black );
graphics2D.setStroke(new BasicStroke( 9.0f ) );
graphics2D.draw( new Rectangle2D.Double( 82, 32, 67, 102 ) );
// This will create a black colored rounded rectangle
BufferedImage bufferedImage = new BufferedImage( 10, 10, BufferedImage.TYPE_INT_RGB );
Graphics2D design = bufferedImage.createGraphics();
design.setColor( Color.blue );
design.fillRect( 0, 0, 9, 9 );
design.setColor( Color.orange );
design.drawRect( 2, 2, 7, 7 );
design.setColor( Color.black );
design.fillRect( 2, 2, 4, 4 );
design.setColor( Color.pink );
design.fillRect( 5, 5, 2, 2 );
graphics2D.setPaint( new TexturePaint( bufferedImage, new Rectangle( 9, 9 ) ) );
graphics2D.fill( new RoundRectangle2D.Double( 156, 31, 76, 101, 51, 51 ) );
graphics2D.setPaint( Color.CYAN );
graphics2D.setStroke(new BasicStroke( 7.0f ) );
graphics2D.draw( new Arc2D.Double( 240, 30, 75, 100, 0, 270, Arc2D.PIE ) );
// this will create line in red and black color
graphics2D.setPaint( Color.red );
graphics2D.draw( new Line2D.Double( 400, 40, 350, 180 ) );
float dashesArray() = ( 20 );
graphics2D.setPaint( Color.black );
graphics2D.setStroke( new BasicStroke( 4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 10, dashesArray, 0 ) );
graphics2D.draw( new Line2D.Double( 320, 30, 395, 150 ) );
)
)

Ausgabe:

Beispiel # 3

Wenden wir 2D Java im folgenden Programm an.

Code:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
public class GeometricShapes2 extends JFrame
(
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main( String args() )
(
GeometricShapes2 design = new GeometricShapes2();
design.addWindowListener(new WindowAdapter()
(
));
)
@SuppressWarnings("deprecation")
public GeometricShapes2()
(
super( "A circle made up of stars by joining them at certain position filled with random colors" );
setBackground( Color. green );
setSize( 450, 450 );
show();
)
public void paint( Graphics graphics )
(
int xCoordinates() = ( 57, 69, 111, 75, 85, 57, 29, 39, 3, 45 );
int yCoordinates() = ( 2, 38, 38, 56, 98, 74, 98, 56, 38, 38 );
Graphics2D graphics2D = ( Graphics2D ) graphics;
GeneralPath starFigure = new GeneralPath();
starFigure.moveTo( xCoordinates( 0 ), yCoordinates( 0 ) );
for ( int j = 1; j < xCoordinates.length; j++ )
starFigure.lineTo( xCoordinates( j ), yCoordinates( j ) );
starFigure.closePath();
graphics2D.translate( 200, 200 );
for ( int i = 1; i <= 10; i++ )
(
graphics2D.rotate( Math. PI / 9.0 );
graphics2D.setColor(new Color( ( int ) ( Math. random () * 128 ), ( int ) ( Math. random () * 128 ),
( int ) ( Math. random () * 128 ) ) );
graphics2D.fill( starFigure );
)
)
)

Ausgabe:

Beispiel # 4

Anwenden der Farbcodierung im folgenden Programm.

Code:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class GeometricShapes3 extends Canvas (
/**
*
*/
private static final long serialVersionUID = 1L;
Frame windowFrame;
TextField sampleText;
Font sampleFont;
Color colorOfText;
Color colorOfCircle;
public static void main(String args()) (
GeometricShapes3 start;
start = new GeometricShapes3();
)
public GeometricShapes3() (
this("Arial", Font.BOLD, 18, Color.gray, Color.red);
)
public GeometricShapes3(String ff, int fs, int fz, Color bg, Color fg) (
setBackground(bg);
colorOfCircle = Color.green.brighter();
colorOfText = fg;
sampleFont = new Font(ff, fs, fz);
sampleText = new TextField("eduCBA (Corporate Bridge Consultancy Pvt Ltd) ");
windowFrame = new Frame("Demo");
windowFrame.add(sampleText, BorderLayout.NORTH);
windowFrame.add(this, BorderLayout.CENTER);
windowFrame.setSize(new Dimension(300, 340));
windowFrame.setLocation(150, 140);
windowFrame.addWindowListener(new WindowAdapter() (
public void windowClosing(WindowEvent we) (
System.exit(0);
)
));
sampleText.addActionListener(new ActionListener() (
public void actionPerformed(ActionEvent ae) (
repaint();
)
));
windowFrame.setVisible(true);
)
public void paint(Graphics graphics) (
String sampleTxt = sampleText.getText();
if (sampleTxt.length() == 0) return;
if (graphics instanceof Graphics2D) (
Dimension dimension = getSize();
Point point = new Point(dimension.width / 2, dimension.height / 2);
int radius = (int)(point.x * 0.84);
graphics.setColor(colorOfCircle);
graphics.drawArc(point.x - radius, point.y - radius,
radius*2-1, radius*2-1,
0, 360);
graphics.setColor(colorOfText);
graphics.setFont(sampleFont);
CircularText((Graphics2D)graphics, sampleTxt, point, radius, -Math.PI/2, 1.0);
)
else (
System.out.println("Some Error Occurred");
)
)
static void CircularText(Graphics2D graphics, String sampleTxt, Point center,
double radius, double length, double height)
(
double circleAngle = length;
Point2D circle = new Point2D.Double(center.x, center.y);
char chArray() = sampleTxt.toCharArray();
FontMetrics fm = graphics.getFontMetrics();
AffineTransform formx, formy;
formx = AffineTransform.getTranslateInstance(circle.getX(), circle.getY());
for(int i = 0; i < chArray.length; i++) (
double cwid = (double)(getWidth(chArray(i), fm));
if (!(chArray(i) == ' ' || Character.isSpaceChar(chArray(i)))) (
cwid = (double)(fm.charWidth(chArray(i)));
formy = new AffineTransform(formx);
formy.rotate(circleAngle, 0.0, 0.0);
String chstr = new String(chArray, i, 1);
graphics.setTransform(formy);
graphics.drawString(chstr, (float)(-cwid/2), (float)(-radius));
)
if (i < (chArray.length - 1)) (
double adv = cwid/2.0 + fm.getLeading() + getWidth(chArray(i + 1), fm)/2.0;
circleAngle += Math.sin(adv / radius);
)
)
)
static int getWidth(char charText, FontMetrics fontMetrics) (
if (charText == ' ' || Character.isSpaceChar(charText)) (
return fontMetrics.charWidth('n');
)
else (
return fontMetrics.charWidth(charText);
)
)
)

Ausgabe:

Beispiel # 5

2D Java für Textgrafiken.

Code:

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
public class FontsDemo extends Frame (
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main( String() argv ) (
FontsDemo myExample = new FontsDemo( "Text Graphics" );
)
public FontsDemo( String title ) (
super( title );
setSize( 450, 180 );
addWindowListener( new WindowAdapter() (
public void windowClosing( WindowEvent we ) (
dispose();
System. exit ( 0 );
)
) );
setVisible( true );
)
public void paint( Graphics g ) (
Graphics2D graphics = (Graphics2D) g;
FontRenderContext frc = graphics.getFontRenderContext();
Font font = new Font( "Arial", Font. HANGING_BASELINE | Font. BOLD, 72 );
TextLayout tl = new TextLayout( "eduCBA", font, frc );
Shape myShape = tl.getOutline( AffineTransform. getTranslateInstance ( 50, 100 ) );
Paint myPaint = loadTextureResource( "1.gif" );
graphics.setPaint( myPaint );
graphics.fill( myShape );
)
public TexturePaint loadTextureResource( String absfilename ) (
MediaTracker tracker = new MediaTracker( this );
Image imtexture = Toolkit.getDefaultToolkit().getImage( absfilename );
tracker.addImage( imtexture, 0 );
try (
tracker.waitForID( 0 );
int width = imtexture.getWidth( this );
int height = imtexture.getHeight( this );
System. out .println( "width" + width + " height =" + height );
BufferedImage buffImg = new
BufferedImage( width, height, BufferedImage. TYPE_INT_ARGB );
Graphics g = buffImg.getGraphics();
g.drawImage( imtexture, 0, 0, this );
return new TexturePaint( buffImg, new Rectangle2D.Double( 0, 0, width, height ) );
)
catch( Exception e ) (
System. out .println( "Exception on Image-Texture Loading" );
)
return null;
)
)

Ausgabe:

Fazit

Nun, da wir das Ende des Artikels erreicht haben, hoffe ich, dass Sie eine gute Vorstellung davon haben müssen, was Sie mit den Java 2D-Grafiken erreichen können. Um ehrlich zu sein, die Funktionen von Java 2D-Klassen sind nicht nur auf einfache Formen und Figuren beschränkt, sondern können auch auf das Entwerfen komplexer Figuren und geometrischer Formen ausgeweitet werden. Dies hängt hauptsächlich davon ab, wie Sie die vorhandenen Klassen und Methoden nutzen.

Empfohlener Artikel

Dies ist eine Anleitung zu 2D-Grafiken in Java. Hier diskutieren wir die Einführung in 2D-Grafik in Java zusammen mit der Code-Implementierung und Ausgabe. Sie können auch unsere anderen Artikelvorschläge durchgehen, um mehr zu erfahren -

  1. Einführung in die 2D-Animationssoftware
  2. 2D- und 3D-Formen | Top 10 Vergleiche
  3. Palindrome in Java mit implementierendem Code
  4. Methoden für GridBagLayout in Java