diff --git a/image-processing/src/main/java/com/baeldung/drawcircle/DrawBufferedCircle.java b/image-processing/src/main/java/com/baeldung/drawcircle/DrawBufferedCircle.java new file mode 100644 index 000000000000..90d0d830f712 --- /dev/null +++ b/image-processing/src/main/java/com/baeldung/drawcircle/DrawBufferedCircle.java @@ -0,0 +1,83 @@ +package com.baeldung.drawcircle; + +import javax.swing.*; +import java.awt.*; +import java.awt.geom.Ellipse2D; +import java.awt.image.BufferedImage; + +public class DrawBufferedCircle { + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + JFrame f = new JFrame("Circle"); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.add(new CircleImagePanel(64, 3)); // final size: 64x64, supersample: 3x + f.pack(); + f.setLocationRelativeTo(null); + f.setVisible(true); + }); + } + + static class CircleImagePanel extends JPanel { + private final int finalSize; + private final BufferedImage circleImage; + + public CircleImagePanel(int finalSize, int scale) { + this.finalSize = finalSize; + this.circleImage = makeCircleImage(finalSize, scale); + setPreferredSize(new Dimension(finalSize + 16, finalSize + 16)); + setBackground(Color.WHITE); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g.create(); + try { + int x = (getWidth() - finalSize) / 2; + int y = (getHeight() - finalSize) / 2; + + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BICUBIC); + + g2.drawImage(circleImage, x, y, finalSize, finalSize, null); + } finally { + g2.dispose(); + } + } + + private BufferedImage makeCircleImage(int finalSize, int scale) { + int hi = finalSize * scale; + BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = img.createGraphics(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_QUALITY); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, + RenderingHints.VALUE_STROKE_PURE); + + g2.setComposite(AlphaComposite.Src); + + float stroke = 6f * scale / 3f; + double diameter = hi - stroke - (4 * scale); + double x = (hi - diameter) / 2.0; + double y = (hi - diameter) / 2.0; + + Shape circle = new Ellipse2D.Double(x, y, diameter, diameter); + + g2.setPaint(new Color(0xBBDEFB)); + g2.fill(circle); + + g2.setPaint(new Color(0x0D47A1)); + g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g2.draw(circle); + + } finally { + g2.dispose(); + } + return img; + } + } +} diff --git a/image-processing/src/main/java/com/baeldung/drawcircle/DrawCircle.java b/image-processing/src/main/java/com/baeldung/drawcircle/DrawCircle.java new file mode 100644 index 000000000000..1f86f762ded4 --- /dev/null +++ b/image-processing/src/main/java/com/baeldung/drawcircle/DrawCircle.java @@ -0,0 +1,46 @@ +package com.baeldung.drawcircle; + +import java.awt.*; +import java.awt.geom.Ellipse2D; +import javax.swing.*; + +public class DrawCircle extends JPanel { + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + Graphics2D g2 = (Graphics2D) g.create(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + + float stroke = 2f; + double diameter = Math.min(getWidth(), getHeight()) - 12; // padding + double x = (getWidth() - diameter) / 2.0; + double y = (getHeight() - diameter) / 2.0; + + Ellipse2D circle = new Ellipse2D.Double(x, y, diameter, diameter); + + g2.setColor(new Color(0xBBDEFB)); + g2.fill(circle); + + g2.setColor(new Color(0x0D47A1)); + g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g2.draw(circle); + } finally { + g2.dispose(); + } + } + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + JFrame f = new JFrame("Circle"); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.add(new DrawCircle()); + f.setSize(320, 240); + f.setLocationRelativeTo(null); + f.setVisible(true); + }); + } +} diff --git a/image-processing/src/main/java/com/baeldung/drawcircle/DrawSupersampledCircle.java b/image-processing/src/main/java/com/baeldung/drawcircle/DrawSupersampledCircle.java new file mode 100644 index 000000000000..bb2de33b28f4 --- /dev/null +++ b/image-processing/src/main/java/com/baeldung/drawcircle/DrawSupersampledCircle.java @@ -0,0 +1,75 @@ +package com.baeldung.drawcircle; + +import javax.swing.*; +import java.awt.*; +import java.awt.geom.Ellipse2D; +import java.awt.image.BufferedImage; + +public class DrawSupersampledCircle { + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> { + JFrame f = new JFrame("SupersampledCircle"); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.add(new CirclePanel()); + f.pack(); + f.setLocationRelativeTo(null); + f.setVisible(true); + }); + } + + static class CirclePanel extends JPanel { + private final BufferedImage hiResImage; + private final int finalSize = 6; + + public CirclePanel() { + int scale = 3; + float stroke = 6f; + + hiResImage = makeSupersampledCircle(scale, stroke); + setPreferredSize(new Dimension(finalSize + 32, finalSize + 32)); + setBackground(Color.WHITE); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + Graphics2D g2 = (Graphics2D) g.create(); + try { + int x = (getWidth() - finalSize) / 2; + int y = (getHeight() - finalSize) / 2; + + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BICUBIC); + + g2.drawImage(hiResImage, x, y, finalSize, finalSize, null); + } finally { + g2.dispose(); + } + } + + private BufferedImage makeSupersampledCircle(int scale, float stroke) { + int hi = finalSize * scale; + BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = img.createGraphics(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + + double d = hi - stroke; + Shape circle = new Ellipse2D.Double(stroke / 2.0, stroke / 2.0, d, d); + + g2.setPaint(new Color(0xBBDEFB)); + g2.fill(circle); + + g2.setPaint(new Color(0x0D47A1)); + g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + g2.draw(circle); + } finally { + g2.dispose(); + } + return img; + } + } +}