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);
}
}
サンプルを実行したところ、両方の描画方法でアンチエイリアスが適用されたようです。あなたが使用しているJDKのバージョンのバグである可能性がありますか?私はWindowsでjdk 1.8.0_77を実行していて、jdk 1.7.0_79でも試してみました。 – Amber
そう考えられます。この問題を示すスクリーンショット/マシンは、JDK 1.8.0_102-b14を実行しているMacです。 jdk 1.8.0_101-b13を実行しているLinuxマシンでサンプルコードをもう一度試してみました。両方の行が同じように描かれ、アンチエイリアスがオンになっているようです。 あなたのコメントを回答として投稿すると、私は同意します。 – user3092671