トップページ > 過去ログ > 記事閲覧
SoftImageに対する単色の書き込み
名前:いっち 日時: 2010/03/03 21:25

いつもお世話になっております。 SoftImageに読み込んだ画像に対して、αチャンネルを統一したり、グラデーションをつけたりする処理を作成しています。 現在はピクセルごとにGetPixelSoftImageを行い、αチャンネルのみを変更しSetPixelSoftImageを行っております。 しかし、GetPixelSoftImageのコストがそれなりにかかる(SetPixelSoftImageの3〜4倍程度)ため、 出来るのであればGetPixelSoftImageを使用せずに、αチャンネルのみの変更を行いたいと考えております。 もし、そのような手段をご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。 管理人さん> 余談ですが、GetDrawScreenSoftImage を使わせて頂いております。GetPixelよりも大分高速で助かります。

Page: 1 |

Re: SoftImageに対する単色の書き込み ( No.1 )
名前:管理人 日時:2010/03/05 23:42

一つのチャンネルだけを更新する関数はありませんが、とりあえず速度を求めるのでしたら ポインタでソフトウエアイメージに直接アクセスするのが一番ですので、ソフトウエアイメージの イメージデータが格納されている先頭アドレスを取得するための関数を追加しました よろしければダウンロードしてください 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 も条件次第でちょっと高速に動作するようにしました それでもポインタでの直アクセスに比べれば天と地ほどの速度差がありますが・・・
Re: SoftImageに対する単色の書き込み ( No.2 )
名前:いっち 日時:2010/03/06 03:00

関数を追加して頂き、ありがとうございます。 我侭を言ってしまい申し訳ありません。 ありがたく使わせて頂きます。 グラデーション以外のフィルタ処理も格段に高速になりそうです。

Page: 1 |