階調の操作にはLookupOpを使う
LookupPlugInは輝度の階調を変更するフィルター。ダイアログから階調値を選ぶとその階調にイメージを変換します。 |
このLookupOpは、ルックアップテーブルを使って会長の各値を別の値に置き換えます。ルックアップテーブルはjava.awt.image.ByteLookupTableというクラスを利用します。これはbyte配列を使って作成することができます。0~255の各階調をどういう値に変更するかをbyte配列として用意するわけです。
[ByteLookupTabl] = new ByteLookupTable(オフセット値,byte配列);
[LookupOp] = new LookupOp([ByteLookupTabl],[RenderingHints]);
[LookupOp].filter([BufferedImage1],[BufferedImage2]);
LookupOpを使ったフィルター処理の流れを整理するとこんな感じになるでしょう。byte配列からByteLookupTableを作成し、それを元にLookupOpを作成する。後は、filterメソッドで第1引数のイメージをフィルター処理したものを第2引数のイメージに描画するだけです。
このLookupOpを使うと、例えば階調を反転したイメージや、フルカラーのイメージを256階調などに落としたもの、特定の階調だけ輝度を変更処理したイメージなどを作成できるようになります。例として、階調数を変更する「LookupPlugIn」を作成してみましょう。これは、ダイアログで選んだ階調に落とすものです。(ただし「2」はRGB各色ごとに2階調で総階調数が2ではありません)
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import jp.tuyano.FreeCapturePlugIn;
public class LookupPlugIn implements FreeCapturePlugIn{
public BufferedImage doPlugin(BufferedImage img,Frame frame) {
if (img == null) return null;
String[] list = {"2","4","8","16","32","64"};
String res = (String)JOptionPane.showInputDialog(frame,
"階調を選んでください。","設定",
JOptionPane.QUESTION_MESSAGE,null,list,list[0]);
int n = 256 / Integer.parseInt(res);
byte[] table = new byte[256];
for(int i = 0;i < 256;i++){
int val = (int)((i + (n / 2)) / n);
table[i] = (byte)(val * n > 255 ? 255 : val * n);
}
ByteLookupTable blt = new ByteLookupTable(0,table);
LookupOp lt = new LookupOp(blt,null);
BufferedImage img2 = new BufferedImage(img.getWidth(),
img.getHeight(),img.getType());
lt.filter(img,img2);
return img2;
}
public String getName() {
return "階調変更...";
}
}
※MANIFEST.MF
Manifest-Version: 1.0
Plugin-Class: LookupPlugIn