トップページ > 記事閲覧
RGBA配列からグラフィックハンドル作成(解決)
名前:enikuro 日時: 2014/03/26 23:42

画像データの各ドットのRGBA情報が格納されている配列があるとします。この配列から、グラフィックハンドルを低負荷で作成する良い方法はありませんか? typedef struct{ int r, g, b, a; }RGBA; RGBA rgba[600][800]; //画像の色情報が既に入っているものと仮定 //CPUで扱うイメージの作成 int Shandle = MakeARGB8ColorSoftImage(800, 600); for (int y = 0; y < 600; y++){ for (int x = 0; x < 800; x++){ DrawPixelSoftImage(Shandle, x, y, rgba[y][x].r, rgba[y][x].g, rgba[y][x].b, rgba[y][x].a); } } int Ghandle = CreateGraphFromSoftImage(Shandle); の様に、1ドットづつ打ち込んでいって作成しています。ですが、これはとんでもなく重いコードなのでこのソースを出来るだけ軽くしたいです。 メモリー上にbmp形式のファイルを作り、それを読み込む方法を一度考えましたが、それではアルファチャネルが組み込めないので駄目でした。 600×800の画像のアルファ値を座標と時間により変化させ、アニメーション描画することを目的としています。(fpsは60です。) こちらの方にも投稿させて頂きました。 http://dixq.net/forum/viewtopic.php?f=3&t=14874 おおよそこの問題は解決しました。 こちらの設定ミスでした。
メンテ

Page: 1 |

Re: RGBA配列からグラフィックハンドル作成(解決) ( No.1 )
名前:管理人 日時:2014/03/27 00:48

リファレンスには無い関数ですが、GetImageAddressSoftImage という、 CPUで扱うイメージが格納されているメモリアドレスを取得する関数を 使用すると高速にイメージを書き込むことができます 載せて頂いたプログラムを GetImageAddressSoftImage と、イメージの 1ライン辺りのバイト数を取得するための関数 GetPitchSoftImage を 使用するようにするとこちらのようになります typedef struct{ int r, g, b, a; }RGBA; RGBA rgba[600][800]; //画像の色情報が既に入っているものと仮定 //CPUで扱うイメージの作成 int Shandle = MakeARGB8ColorSoftImage(800, 600); unsigned char *Img = ( unsigned char * )GetImageAddressSoftImage( Shandle ) ; unsigned char *p ; int ImgPitch = GetPitchSoftImage( Shandle ) ; // ←1ライン辺りのバイト数を取得する関数 for (int y = 0; y < 600; y++){ p = Img + y * ImgPitch ; for (int x = 0; x < 800; x++){ p[ 0 ] = ( unsigned char )rgba[ y ][ x ].b ; p[ 1 ] = ( unsigned char )rgba[ y ][ x ].g ; p[ 2 ] = ( unsigned char )rgba[ y ][ x ].r ; p[ 3 ] = ( unsigned char )rgba[ y ][ x ].a ; p += 4 ; } } int Ghandle = CreateGraphFromSoftImage(Shandle); よろしければお試しください
メンテ
Re: RGBA配列からグラフィックハンドル作成(解決) ( No.2 )
名前:enikuro 日時:2014/03/27 10:13

ありがとうございます!! おかげさまで、高速化できました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存