
解説クラスCopyClear(33)
解説クラスCopyClear(33)
2025年2月22初稿(初講)
この解説は、膨大なクラス「class CopyClear」の定義を
記載したファイル「CopyClear.h」の順番に従い解説して
行く為に今回は、「private:属性」の関数の説明を行う
事にします!今回は「cvt_byte_b()」関数から説明します!
この解説文章は、
解説『解説クラスCopyClear(32)』の続きです
(4-15-84)関数「int cvt_byte_b(TypeArray* ps,
TypeArray* pd,BYTE *lut){・・・}」
/************************************************************************/
/***** LUT変換関数(LUT=Byte単位):S=BYTEの時 *****/
/***** CONVERT,s,d[,LUT] *****/
/************************************************************************/
int CopyClear::cvt_byte_b(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
BYTE *lut // LUTポインタ
){
short buf_s[ 256 ]; // バッファー
long buf_l[ 256 ]; // バッファー
float buf_f[ 256 ]; // バッファー
double buf_d[ 256 ]; // バッファー
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_b_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
up_movb2s( lut, buf_s, 256 ); // LUT単位を変換し
convert_b_s_y( ps, pd, buf_s ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movb2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movb2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movb2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「int cvt_byte_b()」の【関数名】
「cvt」は、英単語「Convert」の省略として変換するの
意味です!ここの画像処理では、LUT≪ルックアップ
テーブル≫を使用したS(元)画像⇒LUT変換⇒
D(結果)画像への画素データをLUT≪Lookuptable≫
として一時的に変換する技法を使用して変換する関数
です!
「byte」は、勿論、「BYTE型」とS(元)画素の単位が、
1バイト無符号を示し、「cvt_byte」で元画像が、
「BYTE型」に成る変換関数です!
★備考★「_」で区切って居るのは、極初期に作成された
ので区切りに「_」を使用するか、単語先頭「英大文字」と
色々迷って居た時期です!
(B)関数「int cvt_byte_b()」の【返値】
この関数自体でエラーチェックするのは、
仮引数「TypeArray* pd,」詰り、D(結果)画像画素単位
が、許されている処理単位で無ければ、
エラー「STI_ARY_5-20」と2番の「TypeArray* 」に問題が
有った事を示し、後は、正常終了「END_STI」を関数辺値と
し返し関数終了!
(C)関数「int cvt_byte_b()」の【仮引数】
int CopyClear::cvt_byte_b(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
BYTE *lut // LUTポインタ
){
「TypeArray* ps,」は、S(元)画像情報へのポインタを
意味します!
「TypeArray* pd,」は、D(結果)画像情報への
ポインタを意味します!
「BYTE *lut」は、LUTの実体へのポインタとして、
この関数では「BYTE *」型、詰り符号無し1バイト単位
です!
(D)関数「int cvt_byte_b()」の【アルゴリズム】
){
short buf_s[ 256 ]; // バッファー
long buf_l[ 256 ]; // バッファー
float buf_f[ 256 ]; // バッファー
double buf_d[ 256 ]; // バッファー
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_b_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
up_movb2s( lut, buf_s, 256 ); // LUT単位を変換し
convert_b_s_y( ps, pd, buf_s ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movb2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movb2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movb2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
(D)ローカル変数
){
short buf_s[ 256 ]; // バッファー
long buf_l[ 256 ]; // バッファー
float buf_f[ 256 ]; // バッファー
double buf_d[ 256 ]; // バッファー
「short buf_s[256];」は、ローカルバッファー
「long buf_l[256];」は、ローカルバッファー
「float buf_f[256];」は、ローカルバッファー
「double buf_d[256];」は、ローカルバッファー
(D)アルゴリズムコード
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_b_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
up_movb2s( lut, buf_s, 256 ); // LUT単位を変換し
convert_b_s_y( ps, pd, buf_s ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movb2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movb2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movb2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
概要「switch(pd->w){・・switch分岐本体・・}」で
D(結果)画像の画素単位が
「case 1:convert_b_b_y(ps,pd,lut);break;」と1バイト
整数型ならば、「convert_b_b_y(ps,pd,lut);break;」で
サブルーチン関数「convert_b_b_y()」で処理し
「case 2:up_movb2s(lut,buf_s,256);
convert_b_s_y(ps,pd,buf_s);break;」と2バイト
整数型ならば、「up_movb2s(lut,buf_s,256);」で
バッファー「short buf_s[256];」へコピーし
サブルーチン関数「convert_b_s_y()」で処理し
「case 4:up_movb2l(lut,buf_l,256);
convert_b_l_y(ps,pd,buf_l);」と4バイト
整数型ならば、「up_movb2l(lut,buf_l,256);」で
バッファー「long buf_l[256];」へコピーし
サブルーチン関数「convert_b_l_y()」で処理し
「case 101:up_movb2f(lut,buf_f,256);
convert_b_l_y(ps,pd,(long*)buf_f);」単精度浮動小数点
型ならば、「up_movb2f(lut,buf_f,256);」で
バッファー「float buf_f[256];」へコピーし
サブルーチン関数「convert_b_l_y()」で処理し★備考★
「long型」も「float型」も同じ4サイズの処理系が前提!
「case 101:up_movb2f(lut,buf_f,256);
convert_b_l_y(ps,pd,(long*)buf_f);」単精度浮動小数点
型ならば、「up_movb2f(lut,buf_f,256);」で
バッファー「float buf_f[256];」へコピーし
サブルーチン関数「convert_b_l_y()」で処理し★備考★
「long型」も「float型」も同じ4サイズの処理系が前提!
「case 102:up_movb2d(lut,buf_d,256);
convert_b_d_y(ps,pd,buf_d);」と倍精度浮動小数点型なら
ば、「up_movb2d(lut,buf_d,256);」で
バッファー「double buf_d[256];」へコピーし
サブルーチン関数「convert_b_d_y()」で処理し
「default:return(STI_ARY_5-20);」と指定外ならば、
エラーコード「STI_ARY_5-20」を関数辺値とし返し関数終了
「return(END_STI);」は、正常終了「END_STI」を関数辺値
とし返し関数終了!
(4-15-85)関数「int cvt_byte_w(TypeArray* ps,
TypeArray* pd,BYTE *lut){・・・}」
/************************************************************************/
/***** LUT変換関数(LUT=Byte単位):S=WORDの時 *****/
/***** CONVERT,s,d[,LUT] *****/
/************************************************************************/
int CopyClear::cvt_byte_w(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
BYTE *lut // LUTポインタ
){
short *bufs; // バッファー:short
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_w_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
bufs = (short*)malloc( sizeof(short) * 65536 ); // メモリ確保
if( bufs == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2s( lut, bufs, 65536 ); // LUT単位を変換し
convert_w_s_y( ps, pd, bufs ); // 左記でLUT変換
free( bufs ); // メモリ解放し
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「int cvt_byte_w()」の【関数名】
「cvt」は、英単語「Convert」の省略として変換するの
意味です!ここの画像処理では、LUT≪ルックアップ
テーブル≫を使用したS(元)画像⇒LUT変換⇒
D(結果)画像への画素データをLUT≪Lookuptable≫
として一時的に変換する技法を使用して変換する関数
です!
「w」は、勿論、「short型」とS(元)画素の単位が、
2バイトを示し、「cvt_byte」で結果画像が、「BYTE型」
と同じく「0..255」に成る変換関数です!
★備考★「」で区切って居るのは、極初期に作成された
ので区切りに「_」を使用するか、単語先頭「英大文字」と
色々迷って居た時期です!
(B)関数「int cvt_byte_w()」の【返値】
この関数自体でエラーチェックするのは、
仮引数「TypeArray* pd,」詰り、D(結果)画像画素単位
が、許されている処理単位で無ければ、
エラー「STI_ARY_5-20」と2番の「TypeArray* 」に問題が
有った事を示し、後は、正常終了「END_STI」を関数辺値と
し返し関数終了!
(C)関数「int cvt_byte_w()」の【仮引数】
int CopyClear::cvt_byte_w(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
BYTE *lut // LUTポインタ
){
「TypeArray* ps,」は、S(元)画像情報へのポインタを
意味します!
「TypeArray* pd,」は、D(結果)画像情報への
ポインタを意味します!
「BYTE *lut」は、LUTの実体へのポインタとして、
この関数では「BYTE *」型、詰り符号無し1バイト単位
です!
(D)関数「int cvt_byte_w()」の【アルゴリズム】
){
short *bufs; // バッファー:short
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_w_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
bufs = (short*)malloc( sizeof(short) * 65536 ); // メモリ確保
if( bufs == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2s( lut, bufs, 65536 ); // LUT単位を変換し
convert_w_s_y( ps, pd, bufs ); // 左記でLUT変換
free( bufs ); // メモリ解放し
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
){
short *bufs; // バッファー:short
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
「short *bufs;」は、ローカルバッファーへのPtr
「long *bufl;」は、ローカルバッファーへのPtr
「float *buff;」は、ローカルバッファーへのPtr
「double* bufd;」は、ローカルバッファーへのPtr
(D―2)アルゴリズムコード
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
convert_w_b_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
bufs = (short*)malloc( sizeof(short) * 65536 ); // メモリ確保
if( bufs == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2s( lut, bufs, 65536 ); // LUT単位を変換し
convert_w_s_y( ps, pd, bufs ); // 左記でLUT変換
free( bufs ); // メモリ解放し
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movb2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
概要「switch(pd->w){・・switch分岐本体・・}」で
D(結果)画像の画素単位が
「case 1:convert_w_b_y(ps,pd,lut);break;」と1バイト
整数型ならば、「convert_w_b_y(ps,pd,lut);break;」で
サブルーチン関数「convert_b_b_y()」で処理し
「case 2:bufs=(short)malloc(sizeof(short)*65536);
if(bufs==0){return(STI_MEM);}
up_movb2s(lut,bufs,65536);
convert_w_s_y(ps,pd,bufs);
free(bufs);break;」と2バイト整数型ならば、
「bufs=(short)malloc(sizeof(short)*65536);
if(bufs==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufs==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2s(lut,bufs,65536);
convert_w_s_y(ps,pd,bufs);
free(bufs);break;」とバッファー「short bufs;」に
コピーし、「convert_w_s_y(ps,pd,bufs)」でLUT変換
サブルーチン関数「convert_w_s_y()」で処理し
「free(bufs);」でメモリ確保の後始末でのメモリ解放!
「case4:bufl=(long)malloc(sizeof(long)*65536);
if(bufs==0){return(STI_MEM);}
up_movb2l(lut,bufl,65536);
convert_w_l_y(ps,pd,bufs);
free(bufl);break;」と4バイト整数型ならば、
「bufl=(long)malloc(sizeof(long)*65536);
if(bufl==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufl==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2l(lut,bufl,65536);
convert_w_l_y(ps,pd,bufl);
free(bufl);break;」とバッファー「long bufl;」に
コピーし、「convert_w_l_y(ps,pd,bufl)」でLUT変換
サブルーチン関数「convert_w_l_y()」で処理し
「free(bufl);」でメモリ確保の後始末でのメモリ解放!
「case101:buff=(float)malloc(sizeof(float)*65536);
if(bufs==0){return(STI_MEM);}
up_movb2f(lut,buff,65536);
convert_w_l_y(ps,pd,bufs);
free(buff);break;」と単精度浮動小数点型ならば、
「buff=(float)malloc(sizeof(float)*65536);
if(buff==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(buff==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2f(lut,buff,65536);
convert_w_l_y(ps,pd,(long)buff);
free(buff);break;」とバッファー「float buff;」に
コピーし、「convert_w_l_y(ps,pd,(long)buff)」で
LUT変換★備考★「long型」と「float型」が同じく
4バイトサイズで有る事が条件の処理系
サブルーチン関数「convert_w_l_y()」で処理し
「free(buff);」でメモリ確保の後始末でのメモリ解放!
「case102:bufd=(double)malloc(sizeof(double)*65536);
if(bufs==0){return(STI_MEM);}
up_movb2f(lut,bufd,65536);
convert_w_d_y(ps,pd,bufs);
free(bufd);break;」と倍精度浮動小数点型ならば、
「bufd=(double)malloc(sizeof(double)*65536);
if(bufd==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufd==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2f(lut,bufd,65536);
convert_w_d_y(ps,pd,bufd);
free(bufd);break;」とバッファー「double bufd;」に
コピーし、「convert_w_d_y(ps,pd,(long)*bufd)」で
LUT変換、サブルーチン関数「convert_w_d_y()」で処理
し、「free(bufd);」でメモリ確保の後始末でのメモリ
解放!
「default:return(STI_ARY_5-20);」と指定外ならば、
エラーコード「STI_ARY_5-20」を関数辺値とし返し関数終了
「return(END_STI);」は、正常終了「END_STI」を関数辺値
とし返し関数終了!
(4-15-86)関数「int cvt_word_b(TypeArray* ps,
TypeArray* pd,short*lut){・・・}」
/************************************************************************/
/***** LUT変換関数(LUT=WORD単位):S=BYTEの時 *****/
/***** CONVERT,s,d[,LUT] *****/
/************************************************************************/
int CopyClear::cvt_word_b(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
short *lut // LUTポインタ
){
BYTE buf_b[ 256 ]; // バッファー
long buf_l[ 256 ]; // バッファー
float buf_f[ 256 ]; // バッファー
double buf_d[ 256 ]; // バッファー
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
up_movs2b( lut, buf_b, 256 ); // LUT単位を変換し
convert_b_b_y( ps, pd, buf_b ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
convert_b_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movs2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movs2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movs2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「int cvt_word_b()」の【関数名】
「cvt」は、英単語「Convert」の省略として変換するの
意味です!ここの画像処理では、LUT≪ルックアップ
テーブル≫を使用したS(元)画像⇒LUT変換⇒
D(結果)画像への画素データをLUT≪Lookuptable≫
として一時的に変換する技法を使用して変換する関数
です!
「b」は、勿論、「BYTE型」とS(元)画素の単位が、
1バイトを示し、「cvt_word」で結果画像が、「short型」
と同じく「-32768..0..32767」に成る変換関数です!
★備考★「_」で区切って居るのは、極初期に作成された
ので区切りに「_」を使用するか、単語先頭「英大文字」と
色々迷って居た時期です!
(B)関数「int cvt_word_b()」の【返値】
この関数自体でエラーチェックするのは、
仮引数「TypeArray* pd,」詰り、D(結果)画像画素単位
が、許されている処理単位で無ければ、
エラー「STI_ARY_5-20」と2番の「TypeArray* 」に問題が
有った事を示し、後は、正常終了「END_STI」を関数辺値と
し返し関数終了!
(C)関数「int cvt_word_b()」の【仮引数】
int CopyClear::cvt_word_b(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
short *lut // LUTポインタ
){
「TypeArray* ps,」は、S(元)画像情報へのポインタを
意味します!
「TypeArray* pd,」は、D(結果)画像情報への
ポインタを意味します!
「short* lut」は、LUTの実体へのポインタとして、
この関数では「short」型、詰り符号有り2バイト単位
です!
(D)関数「int cvt_word_b()」の【アルゴリズム】
){
BYTE buf_b[ 256 ]; // バッファー
long buf_l[ 256 ]; // バッファー
float buf_f[ 256 ]; // バッファー
double buf_d[ 256 ]; // バッファー
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
up_movs2b( lut, buf_b, 256 ); // LUT単位を変換し
convert_b_b_y( ps, pd, buf_b ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
convert_b_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movs2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movs2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movs2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
「BYTE buf_b[256];」は、ローカルバッファー
「long buf_l[256];」は、ローカルバッファー
「float buf_f[256];」は、ローカルバッファー
「double buf_d[256];」は、ローカルバッファー
(D―2)アルゴリズムコード
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
up_movs2b( lut, buf_b, 256 ); // LUT単位を変換し
convert_b_b_y( ps, pd, buf_b ); // 左記でLUT変換
break; //
case 2: // 2バイト単位なら
convert_b_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
up_movs2l( lut, buf_l, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, buf_l ); // 左記でLUT変換
break; //
case 101: // 単精度単位なら
up_movs2f( lut, buf_f, 256 ); // LUT単位を変換し
convert_b_l_y( ps, pd, (long*)buf_f ); // 左記でLUT変換
break; //
case 102: // 倍精度単位なら
up_movs2d( lut, buf_d, 256 ); // LUT単位を変換し
convert_b_d_y( ps, pd, buf_d ); // 左記でLUT変換
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
概要「switch(pd->w){・・switch分岐本体・・}」で
D(結果)画像の画素単位が
「case 1:up_movs2b(lut,buf_b,256);
convert_b_b_y(ps,pd,buf_b);break;」と1バイト
整数型ならば、「up_movs2b(lut,buf_b,256);」で
バッファー「short buf_b[256];」へコピーし
「convert_b_b_y(ps,pd,buf_b);break;」で
サブルーチン関数「convert_b_b_y()」で処理し
「case 2:convert_b_s_y(ps,pd,lut);break;」と2バイト
整数型ならば、サブルーチン関数「convert_b_s_y()」で
処理し
「case 4:up_movs2l(lut,buf_l,256);
convert_b_l_y(ps,pd,buf_l);」と4バイト
整数型ならば、「up_movs2l(lut,buf_l,256);」で
バッファー「long buf_l[256];」へコピーし
サブルーチン関数「convert_b_l_y()」で処理し
「case 101:up_movs2f(lut,buf_f,256);
convert_b_l_y(ps,pd,(long*)buf_f);」単精度浮動小数点
型ならば、「up_movs2f(lut,buf_f,256);」で
バッファー「float buf_f[256];」へコピーし
サブルーチン関数「convert_b_l_y()」で処理し★備考★
「long型」も「float型」も同じ4サイズの処理系が前提!
「case 102:up_movs2d(lut,buf_d,256);
convert_b_d_y(ps,pd,buf_d);」と倍精度浮動小数点型なら
ば、「up_movs2d(lut,buf_d,256);」で
バッファー「double buf_d[256];」へコピーし
サブルーチン関数「convert_b_d_y()」で処理し
「default:return(STI_ARY_5-20);」と指定外ならば、
エラーコード「STI_ARY_5-20」を関数辺値とし返し関数終了
「return(END_STI);」は、正常終了「END_STI」を関数辺値
とし返し関数終了!
(4-15-87)関数「int cvt_word_w(
TypeArray* ps,
TypeArray* pd,short* lut){・・・}」
/************************************************************************/
/***** LUT変換関数(LUT=WORD単位):S=WORDの時 *****/
/***** CONVERT,s,d[,LUT] *****/
/************************************************************************/
int CopyClear::cvt_word_w(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
short *lut // LUTポインタ
){
BYTE *bufb; // バッファー:BYTE
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
bufb = (BYTE*)malloc( sizeof(BYTE) * 65536 ); // メモリ確保
if( bufb == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2b( lut, bufb, 65536 ); // LUT単位を変換し
convert_w_b_y( ps, pd, bufb ); // 左記でLUT変換
free( bufb ); // メモリ解放し
break; //
case 2: // 2バイト単位なら
convert_w_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
(A)関数「int cvt_word_w()」の【関数名】
「cvt」は、英単語「Convert」の省略として変換するの
意味です!ここの画像処理では、LUT≪ルックアップ
テーブル≫を使用したS(元)画像⇒LUT変換⇒
D(結果)画像への画素データをLUT≪Lookuptable≫
として一時的に変換する技法を使用して変換する関数
です!
「w」は、勿論、「UWORD型」とS(元)画素の単位が、
2バイトを示し、「cvt_word」で結果画像が、「short型」
と同じく「-32768..0..32767」に成る変換関数です!
★備考★「_」で区切って居るのは、極初期に作成された
ので区切りに「_」を使用するか、単語先頭「英大文字」と
色々迷って居た時期です!
(B)関数「int cvt_word_w()」の【返値】
この関数自体でエラーチェックするのは、
仮引数「TypeArray* pd,」詰り、D(結果)画像画素単位
が、許されている処理単位で無ければ、
エラー「STI_ARY_5-20」と2番の「TypeArray* 」に問題が
有った事を示し、後は、正常終了「END_STI」を関数辺値と
し返し関数終了!
(C)関数「int cvt_word_w()」の【仮引数】
int CopyClear::cvt_word_w(
TypeArray *ps, // S配列
TypeArray *pd, // D配列
short *lut // LUTポインタ
){
「TypeArray* ps,」は、S(元)画像情報へのポインタを
意味します!
「TypeArray* pd,」は、D(結果)画像情報への
ポインタを意味します!
「short *lut」は、LUTの実体へのポインタとして、
この関数では「short 」型、詰り符号有り2バイト単位
です!
(D)関数「int cvt_word_w()」の【アルゴリズム】
){
BYTE *bufb; // バッファー:BYTE
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
bufb = (BYTE*)malloc( sizeof(BYTE) * 65536 ); // メモリ確保
if( bufb == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2b( lut, bufb, 65536 ); // LUT単位を変換し
convert_w_b_y( ps, pd, bufb ); // 左記でLUT変換
free( bufb ); // メモリ解放し
break; //
case 2: // 2バイト単位なら
convert_w_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
){
BYTE *bufb; // バッファー:BYTE
long *bufl; // バッファー:long
float *buff; // バッファー:float
double *bufd; // バッファー:double
「BYTE *bufb;」は、ローカルバッファーへのPtr
「long *bufl;」は、ローカルバッファーへのPtr
「float *buff;」は、ローカルバッファーへのPtr
「double* bufd;」は、ローカルバッファーへのPtr
(D―2)アルゴリズムコード
switch( pd->w ){ // Dの処理幅が
case 1: // 1バイト単位なら
bufb = (BYTE*)malloc( sizeof(BYTE) * 65536 ); // メモリ確保
if( bufb == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2b( lut, bufb, 65536 ); // LUT単位を変換し
convert_w_b_y( ps, pd, bufb ); // 左記でLUT変換
free( bufb ); // メモリ解放し
break; //
case 2: // 2バイト単位なら
convert_w_s_y( ps, pd, lut ); // 左記でLUT変換
break; //
case 4: // 4バイト整数か
bufl = (long*)malloc( sizeof(long) * 65536 ); // メモリ確保
if( bufl == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2l( lut, bufl, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, bufl ); // 左記でLUT変換
free( bufl ); // メモリ解放し
break; //
case 101: // 単精度単位なら
buff = (float*)malloc( sizeof(float) * 65536 ); // メモリ確保
if( buff == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2f( lut, buff, 65536 ); // LUT単位を変換し
convert_w_l_y( ps, pd, (long*)buff ); // 左記でLUT変換
free( buff ); // メモリ解放し
break; //
case 102: // 倍精度単位なら
bufd = (double*)malloc( sizeof(double) * 65536 ); // メモリ確保
if( bufd == 0 ){ // 失敗時
return( STI_MEM ); // 左記を返す
} //
up_movs2d( lut, bufd, 65536 ); // LUT単位を変換し
convert_w_d_y( ps, pd, bufd ); // 左記でLUT変換
free( bufd ); // メモリ解放し
break; //
default: // 上記以外なら
return( STI_ARY_5 - 20 ); // 不正を返す
} //
return( END_STI ); // 正常終了
}
概要「switch(pd->w){・・switch分岐本体・・}」で
D(結果)画像の画素単位が
「case 1:bufb=(BYTE)malloc(sizeof(BYTE)*65536);
if(bufb==0){return(STI_MEM);}
up_movs2b(lut,bufb,65536);
bufb=(BYTE)malloc(sizeof(BYTE)*65536);
convert_w_b_y(ps,pd,bufb);free(bufb);break;」と
1バイト整数型ならば、65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufb==0){return(STI_MEM);}
up_movs2b(lut,bufb,65536);
convert_w_b_y(ps,pd,bufb);free(bufb);break;」と
「if(bufb==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2s(lut,bufb,65536);
convert_w_s_y(ps,pd,bufb);
free(bufb);break;」とバッファー「short bufb;」に
コピーし、「convert_w_s_y(ps,pd,bufb)」でLUT変換
サブルーチン関数「convert_w_s_y()」で処理し
「free(bufb);」でメモリ確保の後始末でのメモリ解放!
「case 2:convert_w_s_y(ps,pd,lut);break;」と2バイト
整数型ならば、サブルーチン関数「convert_w_s_y()」で
LUT変換
「case4:bufl=(long)malloc(sizeof(long)*65536);
if(bufl==0){return(STI_MEM);}
up_movb2l(lut,bufl,65536);
convert_w_l_y(ps,pd,bufl);
free(bufl);break;」と4バイト整数型ならば、
「bufl=(long)malloc(sizeof(long)*65536);
if(bufl==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufl==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2l(lut,bufl,65536);
convert_w_l_y(ps,pd,bufl);
free(bufl);break;」とバッファー「long bufl;」に
コピーし、「convert_w_l_y(ps,pd,bufl)」でLUT変換
サブルーチン関数「convert_w_l_y()」で処理し
「free(bufl);」でメモリ確保の後始末でのメモリ解放!
「case101:buff=(float)malloc(sizeof(float)*65536);
if(buff==0){return(STI_MEM);}
up_movb2f(lut,buff,65536);
convert_w_l_y(ps,pd,(long)buff);
free(buff);break;」と単精度浮動小数点型ならば、
「buff=(float)malloc(sizeof(float)*65536);
if(buff==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(buff==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2f(lut,buff,65536);
convert_w_l_y(ps,pd,(long)buff);
free(buff);break;」とバッファー「float buff;」に
コピーし、「convert_w_l_y(ps,pd,(long)buff)」で
LUT変換★備考★「long型」と「float型」が同じく
4バイトサイズで有る事が条件の処理系
サブルーチン関数「convert_w_l_y()」で処理し
「free(buff);」でメモリ確保の後始末でのメモリ解放!
「case102:bufd=(double)malloc(sizeof(double)*65536);
if(bufs==0){return(STI_MEM);}
up_movb2f(lut,bufd,65536);
convert_w_d_y(ps,pd,bufs);
free(bufd);break;」と倍精度浮動小数点型ならば、
「bufd=(double)malloc(sizeof(double)*65536);
if(bufd==0){return(STI_MEM);}」と65536サイズの
バッファーを用意★備考★昔は65536サイズの配列で
確保する事がコンパイルシステムで許可出来無かった
システムが多かったのです!
「if(bufd==0){return(STI_MEM);}」でメモリ確保失敗時は
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「up_movb2f(lut,bufd,65536);
convert_w_d_y(ps,pd,bufd);
free(bufd);break;」とバッファー「double bufd;」に
コピーし、「convert_w_d_y(ps,pd,(long)bufd)」で
LUT変換、サブルーチン関数「convert_w_d_y()」で処理
し、「free(bufd);」でメモリ確保の後始末でのメモリ
解放!
「default:return(STI_ARY_5-20);」と指定外ならば、
エラーコード「STI_ARY_5-20」を関数辺値とし返し関数終了
「return(END_STI);」は、正常終了「END_STI」を関数辺値
とし返し関数終了!
(4-15-88)関数「void convertLineX(
TypeArray* ps,TypeArray* pd,
BYTE lut[]){・・・}」
/************************************************************************/
/***** 水平方向輝度変換 *****/
/***** 輝度の傾きの補正用 *****/
/************************************************************************/
void CopyClear::convertLineX(
TypeArray *ps, // S配列(画像)
TypeArray *pd, // D配列
BYTE lut[] // LUT(256×水平幅)
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutX; // LUT:X座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int x; // X座標
int y; // Y座標
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
for( y = 0; y < v; y++ ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
lutX = lut; // LUT先頭セット
for( x = 0; x < h; x++, lutX += 256 ){ // X座標を繰り返し
*ptrD++ = lutX[ *ptrS++ ]; // LUT変換
} //
} //
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!
(A)関数「convertLineX();」の【関数名】
「convert」は、英単語「Convert」として変換するの意味で
す!
「Line」は、カタカナ語ライン詰り線≒水平か垂直方向の
1行/1列を意味し、「LineX」でX座標方向=水平方向に
1行を意味します!
★備考★S(元)画像が1バイト単位でのLUT変換
関数ですが、通常のLUT変換は全ての画素に変換を施すが
ココでは、画素の位置毎に専用のLUTで変換します!
目的として、撮影条件が斜めに成るとかで画素の位置に依っ
て補正を掛ける必要が有る場合のLUT変換処理です!
(B)関数「void convertLineX();」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「convertLineX()」の【仮引数】
void CopyClear::convertLineX(
TypeArray *ps, // S配列(画像)
TypeArray *pd, // D配列
BYTE lut[] // LUT(256×水平幅)
){
「TypeArray* ps,」は、S(元)画像
「TypeArray* pd,」は、D(結果)画像
「BYTE lut[]」は、LUTルックアップテーブル★備考★
サイズは、1バイト画素LUT変換用の256で無く
256×水平幅分のサイズが必要です!
(D)関数「convertLineX()」の【アルゴリズム】
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutX; // LUT:X座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int x; // X座標
int y; // Y座標
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
for( y = 0; y < v; y++ ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
lutX = lut; // LUT先頭セット
for( x = 0; x < h; x++, lutX += 256 ){ // X座標を繰り返し
*ptrD++ = lutX[ *ptrS++ ]; // LUT変換
} //
} //
}
(D-1)ローカル変数
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutX; // LUT:X座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int x; // X座標
int y; // Y座標
「BYTE* ptrS;」は、S(元)画像画素ポインタ
「BYTE* ptrD;」は、D(結果)画像画素ポインタ
「BYTE* lutX;」は、特定X座標位置LUTへのポインタ
「int h;」は、水平幅
「int v;」は、垂直幅
「int x;」は、X座標方向ループカウンタ
「int y;」は、Y座標方向ループカウンタ
(D―2)アルゴリズムコード
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
for( y = 0; y < v; y++ ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
lutX = lut; // LUT先頭セット
for( x = 0; x < h; x++, lutX += 256 ){ // X座標を繰り返し
*ptrD++ = lutX[ *ptrS++ ]; // LUT変換
} //
} //
}
「h=(ps->h<pd->h)?ps->h:pd->h;
v=(ps->v<pd->v)?ps->v:pd->v;」は、有効(最小)水平垂直
幅を算出!
「for(y=0;y<v;y++){・・外側ループ本体・・}」は、
外内と二重ループの外側for構文「for(y=0;y<v;y++)」と
教科書的な記述で分かり易く★備考★外側なので高速化の
意味が少ないのと内側ループ用のfor構文が教科書的な
アップカウンタの方が都合が良いので同じにした方が分かり
易いと判断して採用!では、外側ループ本体
「ptrS=ps->getPtrByte(0,y);ptrD=pd->getPtrByte(0,y);」
は、水平方向処理用のSD両者の処理ポインタをセット!
「lutX=lut;」は、特定X座標位置LUTへのポインタを
先頭(X座標=0)にセット!
「for(x=0;x<h;x++,lutX+=256){*ptrD++=lutX[*ptrS++];}」
は、内側ループ用のfor構文が教科書的な
「x=0;x<h;x++,」X座標をアップカウンタで繰り返し、
「lutX+=256」と内側ループ本体が終わるたびに変換用
LUTを次のX座標様に移動します!どして内側ループ本体
「*ptrD++=lutX[*ptrS++];」でLUT変換します!
(4-15-89)関数「void convertLineY(
TypeArray* ps,TypeArray* pd,
BYTE lut[]){・・・}」
/************************************************************************/
/***** 垂直方向輝度変換 *****/
/***** 輝度の傾きの補正用 *****/
/************************************************************************/
void CopyClear::convertLineY(
TypeArray *ps, // S配列(画像)
TypeArray *pd, // D配列
BYTE lut[] // LUT(256×垂直幅)
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutY; // LUT:Y座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int y; // Y座標
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
lutY = lut; // LUT先頭セット
for( y = 0; y < v; y++, lutY += 256 ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
convert_b_b_x( ptrS, ptrD, lutY, h ); // 水平方向にLUT変換
} //
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!
(A)関数「convertLineY();」の【関数名】
「convert」は、英単語「Convert」として変換するの意味で
す!
「Line」は、カタカナ語ライン詰り線≒水平か垂直方向の
1行/1列を意味し、「LineY」でY座標方向=垂直方向に
1列を意味します!
★備考★S(元)画像が1バイト単位でのLUT変換
関数ですが、通常のLUT変換は全ての画素に変換を施すが
ココでは、画素の位置毎に専用のLUTで変換します!
目的として、撮影条件が斜めに成るとかで画素の位置に依っ
て補正を掛ける必要が有る場合のLUT変換処理です!
(B)関数「void convertLineY();」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「convertLineY()」の【仮引数】
void CopyClear::convertLineY(
TypeArray *ps, // S配列(画像)
TypeArray *pd, // D配列
BYTE lut[] // LUT(256×垂直幅)
){
「TypeArray* ps,」は、S(元)画像
「TypeArray* pd,」は、D(結果)画像
「BYTE lut[]」は、LUTルックアップテーブル★備考★
サイズは、1バイト画素LUT変換用の256で無く
256×垂直幅分のサイズが必要です!
(D)関数「convertLineY()」の【アルゴリズム】
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutY; // LUT:Y座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int y; // Y座標
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
lutY = lut; // LUT先頭セット
for( y = 0; y < v; y++, lutY += 256 ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
convert_b_b_x( ptrS, ptrD, lutY, h ); // 水平方向にLUT変換
} //
}
(D-1)ローカル変数
){
BYTE* ptrS; // S画像ポインタ
BYTE* ptrD; // D画像ポインタ
BYTE* lutY; // LUT:Y座標時のLUT
int h; // 水平幅
int v; // 垂直幅
int y; // Y座標
「BYTE* ptrS;」は、S(元)画像画素ポインタ
「BYTE* ptrD;」は、D(結果)画像画素ポインタ
「BYTE* lutY;」は、特定Y座標位置LUTへのポインタ
「int h;」は、水平幅
「int v;」は、垂直幅
「int y;」は、Y座標方向ループカウンタ
(D―2)アルゴリズムコード
h = ( ps->h < pd->h ) ? ps->h : pd->h; // 有効水平幅算出
v = ( ps->v < pd->v ) ? ps->v : pd->v; // 有効垂直幅算出
lutY = lut; // LUT先頭セット
for( y = 0; y < v; y++, lutY += 256 ){ // Y方向繰り返し
ptrS = ps->getPtrByte( 0, y ); // S画像ポインタセット
ptrD = pd->getPtrByte( 0, y ); // D画像ポインタセット
convert_b_b_x( ptrS, ptrD, lutY, h ); // 水平方向にLUT変換
} //
}
「h=(ps->h<pd->h)?ps->h:pd->h;
v=(ps->v<pd->v)?ps->v:pd->v;」は、有効(最小)水平垂直
幅を算出!
「lutY=lut;」は、特定Y座標位置LUTへのポインタを
先頭(Y座標=0)にセット!
「for(y=0;y<v;y++,lutY+=256){・・ループ本体・・}」は、
ループのfor構文「for(y=0;y<v;y++)」と
教科書的な記述で分かり易く★備考★外側なので高速化の
意味が少ないの教科書的なアップカウンタの方が都合が良い
ので採用!では、
「lutY+=256」とループ本体が終わるたびに変換用LUTを
次のY座標様に移動します!
「ptrS=ps->getPtrByte(0,y);ptrD=pd->getPtrByte(0,y);」
は、垂直方向処理用のSD両者の処理ポインタをセット!
「convert_b_b_x(ptrS,ptrD,lutY,h);」で
サブルーチン関数「convert_b_b_x()」LUT変換処理
(4-15-90)関数「void makeCvtLineLUTSingle(
BYTE lut[],int maxData){・・・}」
/********************************************************************************/
/***** 水平/垂直方向輝度変換用LUT作成 *****/
/***** LUT[0..255]一組み用 *****/
/***** ☆注☆maxData=1..255ならそのまま変換。ただし輝度は低くなる。 *****/
/***** ☆注☆maxData=1..65535なら高輝度変換可能。ただしサチル。 *****/
/********************************************************************************/
void CopyClear::makeCvtLineLUTSingle(
BYTE lut[], // LUTポインタ
int maxData // 最大値 1..65535
){
int i; // カウンタ
double cvt; // 変換データ
int d; // 変換後データ
cvt = maxData / 255.0; // 変換データ作成
for( i = 0; i < 256; i++ ){ // 0..255繰り返し
d = (int)( (double)i * cvt + 0.5 ); // 変換後データ作成
if( d > 255 ){ // 255Over時
d = 255; // 255に補正
} //
lut[i] = d; // LUT作成
} //
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!
(A)関数「makeCvtLineLUTSingle();」の【関数名】
「make」は、作成するで、
「Cvt」は、英単語「Convert」の省略として変換するの
意味です!
「Line」は、カタカナ語ライン詰り線≒水平か垂直方向の
1行/1列を意味し、「LineLUT」でその変換に使用する
LUTを意味します!
「Single」で「単一の」とかの意味で変換用LUTの
水平/垂直何れか片方のLUTを作成する事を命名かな?!
★備考★今と成っては、残念ながら詳細は思い出せないが、
恐らく、アルゴリズムから推測してLUTの1単位分を意味
ではと思う!
(B)関数「void makeCvtLineLUTSingle();」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「makeCvtLineLUTSingle()」の【仮引数】
void CopyClear::makeCvtLineLUTSingle(
BYTE lut[], // LUTポインタ
int maxData // 最大値 1..65535
){
「BYTE lut[]」は、LUTルックアップテーブル★備考★
サイズは、1バイト画素LUT変換用の256で無く
256×垂直幅分のサイズが必要です!
「int maxData」は、LUT変換する最大輝度値
(D)関数「makeCvtLineLUTSingle()」の【アルゴリズム】
){
int i; // カウンタ
double cvt; // 変換データ
int d; // 変換後データ
cvt = maxData / 255.0; // 変換データ作成
for( i = 0; i < 256; i++ ){ // 0..255繰り返し
d = (int)( (double)i * cvt + 0.5 ); // 変換後データ作成
if( d > 255 ){ // 255Over時
d = 255; // 255に補正
} //
lut[i] = d; // LUT作成
} //
}
(D-1)ローカル変数
){
int i; // カウンタ
double cvt; // 変換データ
int d; // 変換後データ
「int i;」は、ループカウンタ
「double cvt;」は、変換データ
「int d;」は、変換後データ
(D―2)アルゴリズムコード
cvt = maxData / 255.0; // 変換データ作成
for( i = 0; i < 256; i++ ){ // 0..255繰り返し
d = (int)( (double)i * cvt + 0.5 ); // 変換後データ作成
if( d > 255 ){ // 255Over時
d = 255; // 255に補正
} //
lut[i] = d; // LUT作成
} //
}
「cvt=maxData/255.0;」は、変換用の基礎係数算出
「for(i=0;i<256;i++){・・本体・・}」は、教科書的な
カウントアップ方式のfor構文「i=0;i<256;i++」で
「0..255」の範囲で本体を繰り返します!その本体
「d=(int)((double)icvt+0.5);if(d>255){d=255;}
lut[i]=d;」と先ず、「d=(int)((double)i*cvt+0.5);」で
変換用後の値を算出し、if構文「if(d>255){d=255;}」で
値が「255詰り1バイト最大値」を越えたら255に補正
「lut[i]=d;」とLUTに格納!
(4-15-91)関数「int makeCvtLineLUT(BYTE lut[],
BYTE tbl[],int len){・・・}」
/************************************************************************/
/***** 水平/垂直方向輝度変換用LUT作成 *****/
/************************************************************************/
int CopyClear::makeCvtLineLUT(
BYTE lut[], // LUT(256×水平/垂直幅)
BYTE tbl[], // 割合テーブル「0..255」
int len // 水平/垂直幅
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
buf = (BYTE**)malloc( sizeof(BYTE*) * 256 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 256; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「makeCvtLineLUT();」の【関数名】
「make」は、作成するで、
「Cvt」は、英単語「Convert」の省略として変換するの
意味です!
「Line」は、カタカナ語ライン詰り線≒水平か垂直方向の
1行/1列を意味し、「LineLUT」でその変換に使用する
LUTを意味します!
(B)関数「int makeCvtLineLUT();」の【返値】
内部で動的にバッファーを確保失敗したらエラーコード
「STI_MEM」を関数辺値とし返し、正常に終了したら
「END_STI」を辺値とし返し関数終了!
(C)関数「makeCvtLineLUT()」の【仮引数】
int CopyClear::makeCvtLineLUT(
BYTE lut[], // LUT(256×水平/垂直幅)
BYTE tbl[], // 割合テーブル「0..255」
int len // 水平/垂直幅
){
「BYTE lut[],」は、LUT★備考★サイズは、
256×「int len」のサイズ
「BYTE tbl[],」は、割合「0..255」格納テーブル
「int len」は、ライン(水平及び垂直)のサイズ(幅)
(D)関数「makeCvtLineLUT()」の【アルゴリズム】
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
buf = (BYTE**)malloc( sizeof(BYTE*) * 256 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 256; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
「BYTE** buf;」は、LUTへのポインターのバッファー
「BYTE* lutXY;」は、LUT≪サイズが256≫個別ポイ
ンタ★備考★XYは、殊更にX座標/Y座標成分を現わして
いる程度に考えてくださいと余り意味のない名称です!
「int k;」は、割合個別係数
「int i;」は、ループカウンタ
(D―2)アルゴリズムコード
buf = (BYTE**)malloc( sizeof(BYTE*) * 256 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 256; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
「buf=(BYTE**)malloc(sizeof(BYTE*)*256);」は、
「BYTE型」のバッファーを256サイズ取得、
「if(buf==0){return(STI_MEM);}」で取得失敗したら、
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「for(i=0;i<256;i++){buf[i]=0;}」は、上記で取得した
バッファーを空ポインタで初期化!
「for(i=0;i<len;i++){・・本体・・}」は、教科書的な
カウントアップ方式でのfor構文「i=0;i<len;i++」で
「0..len-1」までの範囲で繰り返し、本体
「lutXY=&lut[i*256];k=tbl[i];」で個別LUTへの
ポインタと個別の係数を取り出し、
「if(buf[k]==0){makeCvtLineLUTSingle(lutXY,k);
buf[k]=lutXY;}」とif条件「buf[k]==0」と「==0」なら
詰り、初期状態の空ポインタなら、「lutXY=&lut[i256];」
と仮引数「BYTE lut[],」から個別の256バイトサイズの
LUTを切り取る様にポインタを「lutXY」にセットした
後で「makeCvtLineLUTSingle(lutXY,k);」とサブルーチン
関数「makeCvtLineLUTSingle()」でLUTを1単位作成
「buf[k]=lutXY;」と取得したバッファーへポインタセット
「else{up_mova(buf[k],lutXY,256);}」は、既にポインタ
がセットしてあれば、サブルーチン関数「up_mova()」で
内容をコピー
「free(buf);」は、後始末とし動的確保したバッファーを
解放します!
「return(END_STI);」は、正常終了を関数辺値とし返し、
関数終了!
(4-15-92)関数「int makeCvtLineLUT(
BYTE lut[],UWORD tbl[],int len){・・・}」
/************************************************************************/
/***** 水平/垂直方向輝度変換用LUT作成 *****/
/***** ☆注☆「割合」を0..1023と255を超える設定が可能で *****/
/***** ☆注☆画像を高輝度に変換可能、ただし、255以上はサチル。 *****/
/************************************************************************/
int CopyClear::makeCvtLineLUT(
BYTE lut[], // LUT(256×水平/垂直幅)
UWORD tbl[], // 割合テーブル「0..1023」
int len // 水平/垂直幅
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
buf = (BYTE**)malloc( sizeof(BYTE*) * 1024 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 1024; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( k > 1023 ){ // 1023 Overなら
k = 1023; // 1023に補正
} //
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
☆備考☆この関数はファイル「CopyClear030.cpp」に存在!
★注意★この関数は「private:属性」ですのでライブラリの
外から使用不能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「makeCvtLineLUT();」の【関数名】
「make」は、作成するで、
「Cvt」は、英単語「Convert」の省略として変換するの
意味です!
「Line」は、カタカナ語ライン詰り線≒水平か垂直方向の
1行/1列を意味し、「LineLUT」でその変換に使用する
LUTを意味します!
(B)関数「int makeCvtLineLUT();」の【返値】
内部で動的にバッファーを確保失敗したらエラーコード
「STI_MEM」を関数辺値とし返し、正常に終了したら
「END_STI」を辺値とし返し関数終了!
(C)関数「makeCvtLineLUT()」の【仮引数】
int CopyClear::makeCvtLineLUT(
BYTE lut[], // LUT(256×水平/垂直幅)
UWORD tbl[], // 割合テーブル「0..1023」
int len // 水平/垂直幅
){
「BYTE lut[],」は、LUT★備考★サイズは、
256×「int len」のサイズ
「UWORD tbl[],」は、割合「0..255」格納テーブル
「int len」は、ライン(水平及び垂直)のサイズ(幅)
(D)関数「makeCvtLineLUT()」の【アルゴリズム】
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
buf = (BYTE**)malloc( sizeof(BYTE*) * 1024 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 1024; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( k > 1023 ){ // 1023 Overなら
k = 1023; // 1023に補正
} //
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
(D-1)ローカル変数
){
BYTE** buf; // LUTへのPtrバッファー
BYTE* lutXY; // LUT(256:個別)
int k; // 割合(255に対して)
int i; // カウンタ
「BYTE** buf;」は、LUTへのポインターのバッファー
「BYTE* lutXY;」は、LUT≪サイズが256≫個別ポイ
ンタ★備考★XYは、殊更にX座標/Y座標成分を現わして
いる程度に考えてくださいと余り意味のない名称です!
「int k;」は、割合個別係数
「int i;」は、ループカウンタ
(D―2)アルゴリズムコード
buf = (BYTE**)malloc( sizeof(BYTE*) * 1024 ); // バッファーメモリ確保
if( buf == 0 ){ // 確保失敗時は
return( STI_MEM ); // 左記を返す
} //
for( i = 0; i < 1024; i++ ){ // バッファーに
buf[i] = 0; // 空ptrをセット
} //
for( i = 0; i < len; i++ ){ // 幅分繰り返し
lutXY = &lut[ i * 256 ]; // LUT(256:個別)セット
k = tbl[i]; // 割合取り出し
if( k > 1023 ){ // 1023 Overなら
k = 1023; // 1023に補正
} //
if( buf[k] == 0 ){ // 非登録なら
makeCvtLineLUTSingle( lutXY, k ); // 左記でLUT作成
buf[k] = lutXY; // この時のLUTを登録
}else{ // 登録済みなら
up_mova( buf[k], lutXY, 256 ); // LUTデータをコピー
} //
} //
free( buf ); // バッファーメモリ解放
return( END_STI ); // 正常終了
}
「buf=(BYTE**)malloc(sizeof(BYTE*)*1024);」は、
「BYTE型」のバッファーを1024サイズ取得、
「if(buf==0){return(STI_MEM);}」で取得失敗したら、
エラーコード「STI_MEM」を関数辺値とし返し関数終了!
「for(i=0;i<1024;i++){buf[i]=0;}」は、上記で取得した
バッファーを空ポインタで初期化!
「for(i=0;i<len;i++){・・本体・・}」は、教科書的な
カウントアップ方式でのfor構文「i=0;i<len;i++」で
「0..len-1」までの範囲で繰り返し、本体
「lutXY=&lut[i*256];k=tbl[i];
if(k>1023){k=1023;}」で個別LUTへのポインタと個別の
係数を取り出し、条件「k>1023」なら「k=1023;」と補正し
「if(buf[k]==0){makeCvtLineLUTSingle(lutXY,k);
buf[k]=lutXY;}」とif条件「buf[k]==0」と「==0」なら
詰り、初期状態の空ポインタなら、「lutXY=&lut[i256];」
と仮引数「BYTE lut[],」から個別の256バイトサイズの
LUTを切り取る様にポインタを「lutXY」にセットした
後で「makeCvtLineLUTSingle(lutXY,k);」とサブルーチン
関数「makeCvtLineLUTSingle()」でLUTを1単位作成
「buf[k]=lutXY;」と取得したバッファーへポインタセット
「else{up_mova(buf[k],lutXY,256);}」は、既にポインタ
がセットしてあれば、サブルーチン関数「up_mova()」で
内容をコピー
「free(buf);」は、後始末とし動的確保したバッファーを
解放します!
「return(END_STI);」は、正常終了を関数辺値とし返し、
関数終了!
★備考★1024=10ビットの振り幅を用意して居るのは
カメラの1画素の値が「0..1023」と有るカメラ用の関数で
す!
ココまでで区切り≪「private:属性」の関数の並びが、
「makeCvtLineLUT()」関数までとLUT作成の基本部(
整数型から整数型及び浮動小数点型)が終了したので
次から「BinarizationMyselfBase()」と毛色の変わった関数
の説明になるので≫が良いので終わります?!
継続追加は有りません!★備考★
勿論、記載ミスは直して行きますが!
引き続き、
新規解説『解説クラスCopyClear(34)』を
御贔屓下さい!