/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- TransDynamicExpnd
- 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 TransDynamicExpnd implements BrightOp {
/**
* ダイナミックレンジの拡大
* paramsは、最初の2個だけが有効である。
* @param imgSrc ソース画像
* @param imgdst 結果画像
* @param params 初めの2個が有効, 最初が濃度を0にする% 二番目が 濃度を100%にする%
*/
public void Filter(BufferedImage imgSrc, BufferedImage imgDst, int[] params) {
if (params.length < 2) {
throw new IllegalArgumentException("need two param");
}
int nParam1 = params[0]; // 低濃度領域
int nParam2 = params[1]; // 高濃度領域
int nParam22 = 100 - nParam2;
if (nParam1 < 0 || nParam1 > 49) {
throw new IllegalArgumentException("IllegalParam TransDynamicExpnd param1 ... " + nParam1);
}
if (nParam2 < 50 || nParam2 > 100) {
throw new IllegalArgumentException("IllegalParam TransDynamicExpnd param2 ... " + nParam2);
}
double dbStep = 0.0;
double dbMin, dbMax;
// dynamicレンジを拡張する部分のステップ数を求める
if ((nParam1 + nParam22) == 100) { // 特殊な場合
dbStep = 0.0;
} else if ((nParam1 + nParam22) == 0) {
dbStep = 1.0;
} else { // 通常
dbStep = 256.0 / (256.0 - ((256.0 * (nParam1 + nParam22)) / 100.0 )) ;
}
//System.out.println("dbStep = " + dbStep);
// 最小値最大値を求める
dbMin = 256 * nParam1 / 100;
dbMax = 256 * nParam2 / 100;
dbMax = Math.max(0, Math.min(dbMax, 255));
// 変換
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 nNewY;
if (dbY <= dbMin) {
nNewY = 0;
} else if (dbY >= dbMax) {
nNewY = 255;
} else {
nNewY = (int)(((dbY - dbMin) * dbStep) + 0.5);
}
if (nNewY > 255) nNewY = 255;
ayuv = auv | (nNewY << 16);
imgDst.setRGB(w, h, ayuv);
}
}
}
}