組織的ディザ法の実行
デバッグ用ユーティリティ。
// 1...組織的ディザユーティリティ
// 生成したマトリクスを使ってordered ditherを実行する
// (通常は、アプリケーション側でマトリクスを取得して、diteringを実行する)
// 入力
// 画像は、1プレーン分の画像(256階調画像)
// int no; 使用するマスクのプレーン番号(0~プレーン数-1)を指定
// 同じプレーン番号を指定するとdot-on-dotのブルーノイズマトリクス処理となる
// RGBの場合、Rを0、Gを1、Bを2とは限らず好きな組み合わせでよい。
// int width; 画像の幅(単位ピクセル)
// int height; 画像の高さ(単位ピクセル)
// int scanlinesize1; 画像の1ラインのバイト数
// unsigned char* pdata1; 256階調画像
// int scanlinesize2; 出力2/4階調画像の1ラインのバイト数
// 出力
// unsigned char* pdata2; 2/4階調画像
// 2階調では(0/255)、4階調では(0/85/170/255)で返す。
// ライブラリは、1プレーン256階調に限定していないが、これはデバッグ用なので手抜き
void mordereddither2(int no,int width,int height,int scanlinesize1,unsigned char* pdata1,
int scanlinesize2,unsigned char* pdata2);
void mordereddither4(int no,int width,int height,int scanlinesize1,unsigned char* pdata1,
int scanlinesize2,unsigned char* pdata2);
// 2...組織的ディザユーティリティ
// 1行単位で処理するバージョン
// 入力
// int y; 行番号
// その他の引数は、mordereddither2/mordereddither4に同じ
void morderedditherline2(int no,int width,int y,unsigned char* pdata1,unsigned char* pdata2);
void morderedditherline4(int no,int width,int y,unsigned char* pdata1,unsigned char* pdata2);
2階調の場合のソース
void CBNMask::mordereddither2(int no,int width,int height,int scanlinesize1,unsigned char* pdata1,
int scanlinesize2,unsigned char* pdata2)
{
if(mcomponentnum == 1) {
int total = mwidth * mheight;
for(int i = 0 ; i < height ; i++) {
unsigned char* ps1 = pdata1 + scanlinesize1 * i;
unsigned char* ps2 = pdata2 + scanlinesize2 * i;
int y = i % mheight;
unsigned int* ps3 = mpmatrix + mwidth * y;
for(int j = 0 ; j < width ; j++,ps1++,ps2++) {
int x = j % mwidth;
// マトリクスの値以上(しきい値以上)
if(ps3[x] <= *ps1) {
*ps2 = 255;
}
else {
*ps2 = 0;
}
}
}
}
else {
mppchild[no]->mordereddither2(0,width,height,scanlinesize1,pdata1,scanlinesize2,pdata2);
}
}
誤差拡散法の実行
画質や速度を比較するための誤差拡散プログラム
// 品質、速度比較用の誤差拡散プログラム
// Floyd & Steinberg方式
// 入力
// 画像は、1プレーン分の画像(256階調画像専用)
// RGBの場合、各プレーンに対して処理を3回行なう
// int width; 画像の幅(単位ピクセル)
// int height; 画像の高さ(単位ピクセル)
// int scanlinesize1; 画像の1ラインのバイト数
// unsigned char* pdata1; 256階調画像
// float* pdata2; 計算用のワークエリア sizeof(float) * width * heightバイト必要
// 出力
// unsigned char* pdata3; 2/4階調画像
void mfloydsteinberg2(int width,int height,int scanlinesize1,unsigned char* pdata1,float* pdata2,unsigned char* pdata3);
void mfloydsteinberg4(int width,int height,int scanlinesize1,unsigned char* pdata1,float* pdata2,unsigned char* pdata3);