今までは、コントラスト値を変更するたびに
画素値が入った配列をスケーリング計算して、
drawLine()で点を打つという愚かな方法をとってました。
BufferedImageを利用して簡単・高速にコントラスト調整する方法を見つけたので、メモ。
RescaleOPクラスを利用します。
また、今回はグレースケール画像に対してなので
bufferedImageのimageTypeを"TYPE_BYTE_GRAY"としています。
BufferedImage buffer1, buffer2;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if(buffer1 == null){
buffer1 = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
buffer2 = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
}
Graphics2D buf = buffer.createGraphics();
/**
初回のみbuf.drawLine()で点を打っていく。
(あるいは画像を読み込む。)
*/
RescaleOP rop = new RescaleOP(scale, 0.0f, null);
rop.filter(buffer1, buffer2);
g2.drawImage(buffer2, 0, 0, this);
}
float型の変数scaleは初期値1.0fで、
スライダ等で0.0f~2.0fくらい変動できるようにしたらいい感じになりました。
画素値が入った配列をスケーリング計算して、
drawLine()で点を打つという愚かな方法をとってました。
BufferedImageを利用して簡単・高速にコントラスト調整する方法を見つけたので、メモ。
RescaleOPクラスを利用します。
また、今回はグレースケール画像に対してなので
bufferedImageのimageTypeを"TYPE_BYTE_GRAY"としています。
BufferedImage buffer1, buffer2;
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if(buffer1 == null){
buffer1 = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
buffer2 = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
}
Graphics2D buf = buffer.createGraphics();
/**
初回のみbuf.drawLine()で点を打っていく。
(あるいは画像を読み込む。)
*/
RescaleOP rop = new RescaleOP(scale, 0.0f, null);
rop.filter(buffer1, buffer2);
g2.drawImage(buffer2, 0, 0, this);
}
float型の変数scaleは初期値1.0fで、
スライダ等で0.0f~2.0fくらい変動できるようにしたらいい感じになりました。