2017-07-13 8 views
1

Rough and smooth linesBufferedImageでのアンチエイリアス処理でGraphics2D.drawlineを使用するにはどうすればよいですか?

JPanelに描画するとき、私は、レンダリングヒットとしてのアンチエイリアシングを設定し、エッジを平滑化した線を引くことができます。

場合は、しかし、私はBufferedImageを作成し、アンチエイリアシングとその上に同じ線を描画し、その後私は、バッファ画像を描画するJPanel.drawImageを使用し、ライン(例えばアンチエイリアシング=オフ)おおよそ溺れています。

バッファリングされたイメージにアンチエイリアスを使用して線を描画する方法を決定することはできません。誰かがこれがどのように行われるかを明確にすることはできますか

以下の例では、単に2つのJFrameを作成しています。あるフレームでは、パネルを作成して直接描画します。もう一方のフレームでは、パネルを作成してからバッファリングした画像を作成し、次にJPanel.drawImageを使用して表示します。バッファリングされたイメージに表示されている線をアンチエイリアシングで描画したい。

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 
    public static void main(String[] args){ 
     doDirect(); 
     doBuffered(); 
    } 
    public static void doBuffered(){ 
     JFrame frame = new JFrame(); 
     frame.setTitle("BufferedImage drawn with antialiasing on"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JPanel canvas = new JPanel(){ 
      @Override 
      protected void paintComponent(Graphics g){ 
       BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); 
       Graphics2D ig2d = image.createGraphics(); 
       ig2d.setColor(Color.BLACK); 
       ig2d.setStroke(new BasicStroke(3)); 
       ig2d.setRenderingHint(
         RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       ig2d.drawLine(10, 10, 70, 90); 

       Graphics2D g2d = (Graphics2D)g; 
       g2d.drawImage(image, 0, 0, null); 
      } 
     }; 
     canvas.setPreferredSize(new Dimension(100, 100)); 
     frame.getContentPane().add(canvas, BorderLayout.CENTER); 
     frame.setEnabled(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static void doDirect(){ 
     JFrame frame = new JFrame(); 
     frame.setTitle("Directly drawn with antialiasing on"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JPanel canvas = new JPanel(){ 
      @Override 
      protected void paintComponent(Graphics g){ 
       Graphics2D g2d = (Graphics2D)g; 
       g2d.setColor(Color.BLACK); 
       g2d.setStroke(new BasicStroke(3)); 
       g2d.setRenderingHint(
         RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 
       g2d.drawLine(10, 10, 70, 90); 
      } 
     }; 
     canvas.setPreferredSize(new Dimension(100, 100)); 
     frame.getContentPane().add(canvas, BorderLayout.CENTER); 
     frame.setEnabled(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

サンプルを実行したところ、両方の描画方法でアンチエイリアスが適用されたようです。あなたが使用しているJDKのバージョンのバグである可能性がありますか?私はWindowsでjdk 1.8.0_77を実行していて、jdk 1.7.0_79でも試してみました。 – Amber

+1

そう考えられます。この問題を示すスクリーンショット/マシンは、JDK 1.8.0_102-b14を実行しているMacです。 jdk 1.8.0_101-b13を実行しているLinuxマシンでサンプルコードをもう一度試してみました。両方の行が同じように描かれ、アンチエイリアスがオンになっているようです。 あなたのコメントを回答として投稿すると、私は同意します。 – user3092671

答えて

1

サンプルを実行したところ、両方の描画方法でアンチエイリアス処理が適用されたようです。あなたが使っているJDKのバージョンのバグかもしれません。私はWindowsでjdk 1.8.0_77を実行していて、jdk 1.7.0_79でも試してみました。

+0

サンプルコードは、macOS Sierra 10.12.3とjdk 1.8.0_102-b14のMacbookで実行されていました。 jdk 1.8.0_101-b13を使用するCentOS 6.6サーバーなどの他のマシンで実行すると、この問題は発生しません。 – user3092671

+0

Java 1.8.0_131-b11または1.7.0_55-b13のMac OS X 10.11.6では違いはありません。 Mac OS X 10.12.5とJava 1.8.0_131-b11との違いはありません。 – trashgod

関連する問題