Wprowadzenie do grafiki 2D w Javie

Java obsługuje interfejs programowania aplikacji 2D, który umożliwia tworzenie grafiki 2D w bardzo wysokiej jakości. Java 2D API składa się z klas, które mają predefiniowane funkcje lub metody Java, które pozwalają programiście przeprowadzić transformację geometryczną, przetwarzanie obrazu, kompozycję alfa i wiele innych zaawansowanych projektów graficznych.

Java 2D API jest częścią platformy Java 2. Poniżej znajdują się pakiety, z których składa się interfejs API 2D:

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

Java 2D API rozszerza pakiet Abstract Windowing Toolkit (AWT), zapewniając dwuwymiarową grafikę i możliwości obrazowania. Pakiet składa się z w pełni funkcjonalnej platformy do tworzenia bogatego interfejsu użytkownika, programów do rysowania i edytorów obrazów.

Z Java 2D API otrzymasz wsparcie dla następujących funkcji:

  • Pozwoli ci wydrukować złożone dokumenty.
  • Zapewnia zarządzanie kolorami dzięki ulepszonemu zestawowi kolorów.
  • Pakiet ma szeroką gamę gotowych do użycia wzorów geometrycznych, takich jak krzywe, kwadraty, trójkąty, prostokąt
  • Pakiet pozwala renderować dowolny kształt w bardzo intuicyjny sposób.
  • Aby zachować tę samą jakość przez cały proces projektowania, wskazówki renderowania pojawiają się wszędzie tam, gdzie jest to wymagane

Do tej pory dyskutowaliśmy na bardzo wysokim poziomie, czym jest API 2D i co można osiągnąć dzięki temu API. Teraz, gdy masz już trochę tego, przejdźmy głęboko do tej sekcji. Jedną z najważniejszych części jest to, że dzięki renderowaniu 2D Java nie zawsze masz do czynienia z pierwotnymi wzorami geometrycznymi i musisz zaprojektować swoją figurę geometryczną. Zobaczmy więc, jak działa rendering w 2D API.

Rendering 2D Java

Java 2D API obsługuje jednolity model renderowania na wszystkich różnych typach urządzeń, niezależnie od tego, czy jest to monitor lub drukarka. Podczas opracowywania programu renderowanie działa w ten sam sposób, niezależnie od komponentu końcowego, czy jest to drukarka czy monitor. Pakiet automatycznie wykrywa i zmienia kontekst Grafiki na podstawie komponentu końcowego. Java 2D API składa się z java.awt.Graphics2D, który rozszerza klasę Graphics o obsługę ulepszonych funkcji graficznych i renderujących.

Poniżej znajdują się funkcje, które zapewnia pakiet:

  • Obsługuje renderowanie prymitywnych kształtów geometrycznych i figur.
  • Zapewnia opcję wypełnienia wnętrza dowolnego kształtu dowolnym kolorem lub wzorem określonym w atrybutach malowania za pomocą pociągnięć.
  • Pozwala renderować określony obraz.
  • Pozwala konwertować ciągi tekstowe na glify, które mogą być wypełnione kolorami określonymi w atrybutach farby.

Przykład 1

Rzućmy okiem na ten sam program Java i zobaczmy, jak działa.

Kod:

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);
)
)
)

Wynik:

Klasa Graphics zapewnia różne metody rysowania różnych obiektów graficznych. Najpopularniejsze metody to drawString (), drawImage () i fillXxx (). Metody te można ogólnie podzielić na dwie kategorie. Pierwszy rodzaj metody graficznej polega na tym, że zapewnia funkcje rysowania i wypełniania, które pozwalają użytkownikom renderować podstawowe kształty, tekst i obrazy. Innym rodzajem metody są ustawienia atrybutów, które pozwalają zmienić efekt wyglądu rysunku w konsoli. Metody takie jak setColor i setFont pozwalają decydować o sposobie renderowania i rysowania i wypełniania. Kontekst graficzny odpowiada za utrzymanie stanu lub atrybutów, takich jak bieżący kolor malowania, bieżąca czcionka.

Przykład nr 2

Zobaczmy kolejny przykład tego, co jeszcze możemy osiągnąć dzięki klasom Java 2D.

Kod:

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 ) );
)
)

Wynik:

Przykład nr 3

Zastosujmy java 2D w następującym programie.

Kod:

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 );
)
)
)

Wynik:

Przykład 4

Stosowanie kodowania kolorami w następującym programie.

Kod:

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);
)
)
)

Wynik:

Przykład 5

Java 2D dla grafiki tekstowej.

Kod:

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;
)
)

Wynik:

Wniosek

Teraz, gdy dotarliśmy do końca artykułu, mam nadzieję, że musicie mieć dobry pomysł na to, co można osiągnąć dzięki grafice Java 2D. Szczerze mówiąc, możliwości klas Java 2D nie ograniczają się do prostych kształtów i figur, można je rozszerzyć na projektowanie złożonych figur i kształtów geometrycznych i głównie zależy od tego, w jaki sposób wykorzystujesz istniejące klasy i metody.

Polecany artykuł

To jest przewodnik po grafice 2D w Javie. Tutaj omawiamy Wprowadzenie do grafiki 2D w Javie wraz z implementacją i wyjściem kodu. Możesz także przejrzeć nasze inne sugerowane artykuły, aby dowiedzieć się więcej -

  1. Wprowadzenie do oprogramowania do animacji 2D
  2. Kształty 2D i 3D | 10 najlepszych porównań
  3. Palindrome in Java With Implementing Code
  4. Metody GridBagLayout w Javie