我正在使用
Java Graphics而且我一直在变得“丑陋”.
这是我的Java程序所做的
这是在Matlab中做的同样的事情
我认为Java显然不像Matlab那样“好看”,特别是在圆的边缘.请注意,这与分辨率无关……这些图像的大小几乎相同.另请注意,我已经设置了渲染提示.
这是一个独立的主要功能,你可以运行来测试这个.
- package test;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.EventQueue;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.Shape;
- import java.awt.geom.AffineTransform;
- import java.awt.geom.Ellipse2D;
- import java.awt.image.BufferedImage;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.UIManager;
- public class SimplePaint02 {
- private static final int LINE_THICKNESS = 4;
- private static final int LINE_GAP = 10;
- private Color lineColor = Color.red;
- public static void main(String[] args) {
- new SimplePaint02();
- }
- public SimplePaint02() {
- EventQueue.invokeLater(new Runnable() {
- @Override
- public void run() {
- try {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- } catch (Exception ex) {
- }
- JFrame frame = new JFrame();
- frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
- frame.setLayout(new BorderLayout());
- frame.add(new TestPane());
- frame.pack();
- frame.setLocationRelativeTo(null);
- frame.setVisible(true);
- }
- });
- }
- public class TestPane extends JPanel {
- @Override
- public Dimension getPreferredSize() {
- return new Dimension(100,100);
- }
- @Override
- public void paintComponent(Graphics g) {
- int radius = 50;
- BufferedImage buffer = new BufferedImage(radius,radius,BufferedImage.TYPE_INT_ARGB);
- Graphics2D g2d = buffer.createGraphics();
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
- g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- Ellipse2D circle = new Ellipse2D.Float(0,radius);
- Shape clip = g2d.getClip();
- g2d.setClip(circle);
- AffineTransform at = g2d.getTransform();
- g2d.setTransform(AffineTransform.getRotateInstance(Math.toRadians(45),radius / 2,radius / 2));
- int gap = LINE_GAP;
- g2d.setColor(Color.WHITE);
- g2d.fill(circle);
- g2d.setColor(lineColor);
- //g2d.setStroke(new BasicStroke(LINE_THICKNESS));
- for (int index = 0; index < 10; index++) {
- int x1 = index*gap-(LINE_THICKNESS/2);
- int y1 = 0;
- int x2 = index*gap+(LINE_THICKNESS/2);
- int y2 = radius;
- int width = x2 - x1;
- int height = y2 - y1;
- g2d.fillRect(x1,y1,width,height);
- //g2d.drawLine(index * gap,index * gap,getRadius());
- }
- g2d.setTransform(at);
- g2d.setClip(clip);
- g2d.dispose();
- g.drawImage(buffer,this);
- }
- }
- }
解决方法
编辑:请参阅Code Guy的答案以获得解决方案.这是正确的,因为Joey Rohan最初想出来了!
当我尝试同样的事情时,我得到了顺利的优势:
- g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
- import java.awt.Color;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import javax.imageio.ImageIO;
- public class DrawSmoothCircle {
- public static void main(String[] argv) throws Exception {
- BufferedImage bufferedImage = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
- Graphics2D g2d = bufferedImage.createGraphics();
- g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
- g2d.setPaint(Color.green);
- g2d.fillOval(10,10,50,50);
- g2d.dispose();
- ImageIO.write(bufferedImage,"png",new File("e:\\newimage.png"));
- }
- }
更新:
搜索了很多:
代码没有错,但是,
好吧,不幸的是Java 2D(或者至少Sun目前的实现)不支持“软剪辑”.
但也有一个技巧的剪辑:
按照This link,您可以实现您的要求.
(另外,我有一个平滑的边缘,因为我不会使用剪辑的东西,在我上面的图像)