我正在使用
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目前的实现)不支持“软剪辑”.
原文地址:https://www.jb51.cc/java/127203.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。