トップページ > 記事閲覧
画像を配列に取得する単純な get put 関数がほしい
名前:大和団次郎 日時: 2023/11/30 10:29

DxLibを使って、Android用アプリをつくってます。 先日、X68000Z にアプリを移植したのですが、以下のような関数があって便利でした。 同じような関数はできないでしょうか get int get(int x1,int y1,int x2, int y2, int *na, int sz) アクティブページのwindow内の指定の範囲(x1,y1)-(x2,y2)の グラフィックのドットパターンを配列 na に取り込む。 引数 na は配列 x1,y1...取り込む左上頂点の座標 x2,y2...取り込む範囲の右下頂点+1の座標 na......取り込まれる配列ポインタ sz......確保された配列のバイト数(sizeof(na)) 戻り値 0:成功 −1:エラー発生 put int put(int x1,int y1,int x2, int y2, int *na, int sz) get関数で取り込んだドットパターンを画面に配置する。 引数 na は配列 x1,y1...左上頂点の座標 x2,y2...右下頂点+1の座標 na......データ配列のポインタ sz......確保された配列のバイト数(sizeof(na)) 戻り値 0:成功 −1:エラー発生 クリッピング領域や画像がない部分を含む場合はエラーでかまいません 使用目的ですが、いろんな用途に使えるとおもいますが、 一番ほしいのは、文字処理で、 以下のようなことを高速に処理したいです 1)裏画面に文字かいて、配列Aに get 2)配列Aに取得した文字パターンに独自イフェクトを加える(変形、色追加とかいろいろ) 3)表画面の文字出力場所を配列Bに get 4)イフェクトをつけた文字を配列Bに合成 5)配列Bを元の場所に put 配列にはいる色の順番や、ビット数が、デバイスによって異なるかもしれません。 知る方法があればありがたいですが 用意する最大値だけ教えてもらって、あとは自分で調べるでもよいです。 どうでしょうか
メンテ

Page: 1 |

Re: 画像を配列に取得する単純な get put 関数がほしい ( No.1 )
名前:管理人 日時:2023/12/02 01:17

C++のプログラムで画像データを直接扱いたいということでしたら MakeARGB8ColorSoftImage などの関数で作成できるソフトウェアイメージがあります // ソフトウエアイメージハンドルの作成( ARGB8 カラー ) int MakeARGB8ColorSoftImage( int SizeX, int SizeY ) ; // ソフトウエアイメージハンドルの削除する int DeleteSoftImage( int SIHandle ) ; // 描画対象の画面から指定領域をソフトウエアイメージハンドルに転送する int GetDrawScreenSoftImage( int x1, int y1, int x2, int y2, int SIHandle ) ; // ソフトウエアイメージハンドルの画像が格納されているメモリ領域の先頭アドレスを取得する void *GetImageAddressSoftImage( int SIHandle ) ; // ソフトウエアイメージハンドルのメモリに格納されている画像データの1ライン辺りのバイト数を取得する int GetPitchSoftImage( int SIHandle ) ; // ソフトウエアイメージハンドルを画面に描画する int DrawSoftImage( int x, int y, int SIHandle ) ; 直接 int型配列に代入することは出来ませんが、GetImageAddressSoftImage で ピクセルの配列を取得することが出来ます unsigned int *Pixels = ( unsigned int * )GetImageAddressSoftImage( SIHandle ) ; int Pitch = GetPitchSoftImage( int SIHandle ) ; // x=0 y=0 のピクセルを灰色にする Pixels[ 0 ] = 0xff808080 ; // x=56 y=0 のピクセルを緑色にする Pixels[ 56 * 4 ] = 0xff00ff00 ; // x=100 y=80 のピクセルを青色にする Pixels[ 100 * 4 + 80 * Pitch ] = 0xff0000ff ; // 画像全体を半分の明るさにする int SizeX, SizeY ; GetSoftImageSize( SIHandle, &SizeX, &SizeY ); unsigned char *p = ( unsigned char * )Pixels ; for( int i = 0; i < SizeY; i ++ ) { for( int j = 0; j < SizeX; j++ ) { p[ 0 ] = p[ 0 ] >> 1 ; p[ 1 ] = p[ 1 ] >> 1 ; p[ 2 ] = p[ 2 ] >> 1 ; p += 4 ; } } MakeARGB8ColorSoftImage で作成したソフトイメージは各ピクセルが B G R A の順番で並んでいます( それぞれ値の範囲は 0〜255、1ピクセルにつき 4バイト ) unsigned char *img = ( unsigned char * )GetImageAddressSoftImage( SIHandle ) ; img[ 0 ] : x=0 y=0 の青 img[ 1 ] : x=0 y=0 の緑 img[ 2 ] : x=0 y=0 の赤 img[ 3 ] : x=0 y=0 のアルファ img[ 4 ] : x=1 y=0 の青 img[ 5 ] : x=1 y=0 の緑 img[ 6 ] : x=1 y=0 の赤 img[ 7 ] : x=1 y=0 のアルファ img[ 8 ] : x=2 y=0 の青 img[ 9 ] : x=2 y=0 の緑 img[ 10 ] : x=2 y=0 の赤 img[ 11 ] : x=2 y=0 のアルファ get は GetDrawScreenSoftImage put は DrawSoftImage が対応する関数となります ただ、DrawSoftImage はシステムメモリにある画像データを VRAM に転送してから描画を行うので 同じ大きさの画像を DrawGraph で描画する場合に比べて数十倍の処理時間が掛かりますので 高速な描画が必要な箇所では使用しないようにしてください m(_ _)m
メンテ
Re: 画像を配列に取得する単純な get put 関数がほしい ( No.2 )
名前:大和団次郎 日時:2023/12/02 15:02

リアルタイムでキーフレーム補間して、アニメーションをつくるアプリを作っているのですが、 今は、いまはいろんなイフェクトをかけた図形を、自作の画像メモリに作成したあと、 1フレームの画像ができたら、1回だけ、SoftImageをとおして、表示画面に転送しています。 自作の画像メモリの中に文字が描画できないので、SoftImageをとおして画面に転送したあと DxLib で、その上に文字を描画しているのですが、 その結果、文字が必ず最前面になるので、Android版の仕様制限になってます。 もし、文字ビットマップだけ高速に取得できれば、好きなタイミングで自作メモリの中に文字をいれてから、 最後に1回だけ、SoftImageをとおして描画したいのですが、 文字のビットマップを取得するには、文字を描画して、SoftImageをとおして取得するしかないでしょうか
メンテ
Re: 画像を配列に取得する単純な get put 関数がほしい ( No.3 )
名前:管理人 日時:2023/12/03 23:23

すみません、リファレンスには載っていませんが、SoftImage に文字を描画する以下の関数があります // ソフトウエアイメージハンドルに文字列を描画する( デフォルトフォントハンドルを使用する ) int BltStringSoftImage( int x, int y, char *StrData, int DestSIHandle, int DestEdgeSIHandle = -1, int VerticalFlag = FALSE ) ; // ソフトウエアイメージハンドルに文字列を描画する( フォントハンドル使用版 ) int BltStringSoftImageToHandle( int x, int y, char *StrData, int DestSIHandle, int DestEdgeSIHandle /* 縁が必要ない場合は -1 */, int FontHandle, int VerticalFlag = FALSE ) ; ただ、色指定はできず、必ず白色での描画となりますので、使い方としては文字描画専用の SoftImage に 一度描画した後、その SoftImage の値を GetImageAddressSoftImage で取得したアドレスを使って読み取りながら 対象となる SoftImage に文字を描画する形になると思います よろしければお試しください m(_ _)m
メンテ
Re: 画像を配列に取得する単純な get put 関数がほしい ( No.4 )
名前:大和団次郎(解決すみ) 日時:2023/12/04 10:32

おおっ! この関数を5年間さがしてました!!!!!!!!<--感動 使います! ずっとこの関数は残しておいてほしいです!
メンテ
Re: 画像を配列に取得する単純な get put 関数がほしい ( No.5 )
名前:管理人(解決) 日時:2023/12/04 23:08

ご希望に添えたようで何よりです > ずっとこの関数は残しておいてほしいです! 了解です 余程の事が無い限りこちらの関数が無くなることはないと思います (^ ^;
メンテ

Page: 1 |

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

   クッキー保存