一つのチャンネルだけを更新する関数はありませんが、とりあえず速度を求めるのでしたら
ポインタでソフトウエアイメージに直接アクセスするのが一番ですので、ソフトウエアイメージの
イメージデータが格納されている先頭アドレスを取得するための関数を追加しました
よろしければダウンロードしてください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
追加した関数は以下の関数です
// ソフトウエアで扱うイメージの実イメージが格納されているメモリ領域の先頭アドレスを取得する
void *GetImageAddressSoftImage( int SIHandle ) ;
ソフトウエアイメージのピクセルフォーマットは様々なので実イメージのアクセスには
各ピクセルフォーマットに合った処理をしなければなりませんが、アクセスしたい
イメージが MakeARGB8ColorSoftImage や MakeXRGB8ColorSoftImage で作成したイメージでしたら、
フォーマットは固定されていますので容易にアクセスすることができます
MakeARGB8ColorSoftImage で作成されたイメージはイメージの一番左上のピクセルから順に
GetImageAddressSoftImageの戻り値のアドレスから何バイト目か
↓
0byte:(0,0)のピクセル
4byte:(0,1)のピクセル
8byte:(0,2)のピクセル
12byte:(0,3)のピクセル
という風に並んでいます、1ライン分の後は(1,0)のピクセルが・・という風に並んでいます、
そして1ピクセル4byteですが、その内訳は
0byte:青
1byte:緑
2byte:赤
3byte:アルファ
です、なのでアルファだけにアクセスしたい場合は各ピクセルの4バイト目だけを書き換えれば
良いと言う事になります、
例:MakeARGB8ColorSoftImage で作成したソフトウエアイメージの x=54 y=11 のピクセルの
アルファ値を 164 にする場合
int w, h ;
BYTE *image ;
GetSoftImageSize( softimage, &w, &h ) ;
image = ( BYTE * )GetImageAddressSoftImage( softimage ) ;
image[ 54 * 4 + 11 * ( w * 4 ) + 3 ] = 164 ;
// アクセスしたいX座標 * 1ピクセル辺りのバイト数 + アクセスしたいY座標 * 1ライン辺りのバイト数( それは横幅×1ピクセル辺りのバイト数 ) + アクセスしたいチャンネルのバイト番地
という感じになります
全ピクセルに対して同じ処理をする場合は
// 全ピクセルの赤色を255にする処理
int i, size, w, h ;
BYTE *image ;
GetSoftImageSize( softimage, &w, &h ) ;
image = ( BYTE * )GetImageAddressSoftImage( softimage ) ;
size = w * h ;
for( i = 0 ; i < size ; i ++, image += 4 )
{
image[ 2 ] = 0 ;
}
各ラインで違う処理をする場合は
// 256x256サイズの白から黒のグラデーションの画像を作成する
int i, j ;
BYTE *image ;
softimage = MakeARGB8ColorSoftImage( 256, 256 ) ;
image = ( BYTE * )GetImageAddressSoftImage( softimage ) ;
for( i = 0 ; i < 256 ; i ++ )
{
for( j = 0 ; j < 256 ; j ++, image += 4 )
{
image[ 0 ] = i ;
image[ 1 ] = i ;
image[ 2 ] = i ;
image[ 3 ] = 255 ;
}
}
というように、全ピクセルを走査するような処理の場合は
image[ 54 * 4 + 11 * ( w * 4 ) + 3 ] というようなアドレス計算を入れないようにすると高速です
よろしければお使い下さい m(_ _)m
あ、あと GetPixelSoftImage も条件次第でちょっと高速に動作するようにしました
それでもポインタでの直アクセスに比べれば天と地ほどの速度差がありますが・・・