/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- TransFloorQuantum
- Filter
package jp.ac.nime.computer.grpsimulator.ImgPr;
import java.awt.*;
import java.awt.image.*;
/**
* 階調量子化
* BufferedImageは、ARGBのINT型にパックされている構造に AYUVが入っていると想定している。
* 計算するバッファと出力するバッファは、同じ大きさ・Colorであることが必須である。
*
* @author Kikuchi
* @see BrightOp
* @since 0.1
* @version 1.0.0
*/
public class TransFloorQuantum implements BrightOp {
/**
* 階調量子化
* paramsは、最初の一個だけが有効である。
* @param imgSrc ソース画像
* @param imgdst 結果画像
* @param params 初めの一個だけが有効, 階段の数 1 -> 10
*/
public void Filter(BufferedImage imgSrc, BufferedImage imgDst, int[] params) {
if (params.length < 1) {
throw new IllegalArgumentException("need one param");
}
int nParam = params[0]; // 階段の数
if (nParam < 1 || nParam > 255) {
throw new IllegalArgumentException("IllegalParam TransFloorQuantum param ... " + nParam);
}
// 階段数からテーブルを作り出す
int nFloors[] = new int [nParam];
double dbStep = 256.0 / nParam;
nFloors[0] = 0;
for (int h = 1; h < nParam; h ++) {
nFloors[h] = (int)(dbStep * (double)h + 0.5); // 補正して整数化
//System.out.println("nFloors[" + h + "] = " + nFloors[h]);
}
// 最後のテーブルは調整する
if (nFloors[nParam - 1] >= 254)
nFloors[nParam - 1] = 255;
// テーブルを使って各ピクセルの y の値を変更する
for (int h = 0; h < imgSrc.getHeight(); h ++) {
for (int w = 0; w < imgSrc.getWidth(); w ++) {
// yを取り出す
int ayuv = imgSrc.getRGB(w, h); // ARGB つまり AYUV
int auv = ayuv & 0xff00ffff; // y以外
double dbY = ((ayuv & 0x00ff0000) >> 16);
// 計算
int n = (int)((dbY / dbStep) + 0.5);
if (n > nParam - 1) n = nParam - 1; // ありえないけどチェック
int nNewY = nFloors[n];
ayuv = auv | (nNewY << 16);
imgDst.setRGB(w, h, ayuv);
}
}
}
}