FMXでのTBitMapの使い方

解決


yTake  2017-02-07 03:29:54  No: 48517

yTakeです。
度々、すみません。

複数のファイルから濃度のマトリックス・データを読み込み、GrayScaleに換算して、複数のBitmap画像に書き込みます。
一つのTImageコンポーネントに複数のTBitMap画像を切り替えて表示する事を実現します。

VCLの場合、各濃度マトリックス・データ用にPixelFormat=pf24BitとしてBitmapを用意します。(サイズも合わせます)

切り替えのイベント時に次に表示するBitmap画像を、共通のImageコンポーネントに縦横比を維持したままStrechDrawで描画させていました。
Image.Canvas.StrechDraw( rect, bitmap );
rect:書き替える画像のBitmapの縦横比を維持
bitmap:書き替える画像

FMXの場合、先ず、PixelFormatの設定がうまくゆきません。
"pf24bit"と言う定義値はない様で、help等によると"RGB"と言う定義値を使う様ですが、”宣言されていない識別子”となってしまいます。
uses節で、"FMX.Graphics"や"FMX.Types"は宣言しています。

どの様にPixelFormatを設定するのでしょうか?

また、Bitmapに描画が完了できたとして、ImageコンポーネントへのBitmapの切り替え表示は、同様に、
Image.Canvas.DrawBitmap(bitmap,src_rect,dst_rect,opacity);
で、実現できるのでしょうか?
Image.Canvas:共通の描画先
Bitmap:書き替えるの画像
src_rect:書き替える画像の描画範囲(元のBitmap全体)
dst_rect:Image.canvasを超えない範囲で縦横比を維持する
opacity:透過度
の様に、解釈しています。

PixelFormatの設定が出来ていない為か、エラーは出ませんがImageコンポーネントには何も描画されません。

そもそもDrawBitmapの使い方は正しいでしょうか?

ご教授頂ければと思います。

当方、
32ビットWindows10+DELPHI XE6


Mr.XRAY  2017-02-07 04:33:21  No: 48518

>どの様にPixelFormatを設定するのでしょうか? 

設定の方法はさておいて.
Delhi XE6 ですよね.
でしたら,TPixelFormat の値はこれかも知れません.
ヘルプを調べただけですので,違っていたらゴメンナさい.

http://docwiki.embarcadero.com/Libraries/XE6/ja/FMX.Types.TPixelFormat

[注意]
上の記事は Delphi XE6 のです.Delhi XE5 以前は違うようですので...


Mr.XRAY  2017-02-07 04:55:41  No: 48519

>GrayScaleに換算して

グレイスケールに変換ですね.
もしかしたら,こんなとこかも知れません.

http://docwiki.embarcadero.com/Libraries/XE6/ja/FMX.Filter.Effects.TMonochromeEffect

TMonochromeEffect は [Effects] タブにあるようです.

http://ht-deko.com/techf001_effects.html


Mr.XRAY  2017-02-07 05:01:16  No: 48520

質問内容とは直接関係ありませんが,このスレッドを見ている方への参考として.

最近はオンラインヘルプも少し充実してきています.
以下のページで.該当コンポーネントへのリンクをクリックすると画像効果の結果が観られます.

[FireMonkey の画像効果]
http://docwiki.embarcadero.com/RADStudio/XE6/ja/FireMonkey_%E3%81%AE%E7%94%BB%E5%83%8F%E5%8A%B9%E6%9E%9C


yTake  2017-02-07 05:03:08  No: 48521

Mr.XRAYさん
ありがとうございます。
はい。当方、XE6です。

ご案内の参照はhelpの内容と同じ様です。
ここで、"RGB"や"RGBA"他と設定し、"FMX.Types"が参照されている様に記述されていると思います。
しかしながら、”宣言されていない識別子”となってしまいます。

ここで気になるのは、”新しいTPixelFormatの値は、FMX.TPixelFormat.TPixelFormatの値と異なります(より短く少数)”と言う箇所です。
この変更により、このヘルプの記述では識別されない定義値が生じているのでしょうか?

サンプル・ソース(FlagPrinting)もあるのですが、印刷用サンプルらしく、PixelFormatの例は見当たりませんでした。

helpの解釈が違っているのでしょうか???

基本的な事かもしれませんが、ご教授願えればと思います。


Mr.XRAY  2017-02-07 07:23:37  No: 48522

FireMonkey TBitmap TBitmapData PixelFomat

等でググってみてください.
後は... とりあえず.


Mr.XRAY  2017-02-07 07:25:27  No: 48523

もしかしたら,Map も検索語句に入れた方がいいかも知れません.


yTake  2017-02-07 18:28:02  No: 48524

Mr.XRAYさん

ありがとうございます。

すみません。先のレスは行き違いもありご紹介のサイトを参照前でした。

色々やってみたところ、PixelFormatの設定方法に疑問が生じました。

これまで、
bmp.PixelFormat := RGB
の様に代入していて、その為識別子として"RGB"や"RGBA"などが未定義となってしまっていました。

bmp.PixelFormat.BGR;

の様に、PixelFormatプロパティには選択肢がありました。その中に"RGB"や"BGR"、"RGBA"(色の順なので、"BGR")などがあり、一つを選択すると未定義エラーはなくなりました。

しかしながら、
bmp := TBitMap.Create();
bmp.PixelFormat.BGR;
としても、コンパイルでエラー”E2018 レコード、オブジェクト又はクラスのいずれかが必要です”
となります。

"bmp.PixelFormat.BGR"は定数(const)として定義されている様なので、
ダメ元で、
bmp.PixelFormat := bmp.PixelFormat.BGR;
としてみましたが、同じエラーでした。

付属の"Object Pascal"ー>"FireMonket Desktop"のサンプル内ではTBitMap.PixelFormatを用いている例は無い様です。(フォルダー内検索してみました)

FireMonkeyでTBitMap.PixelFormatの設定方法をご教授願えるか、参考になるwebページをご紹介頂けるでしょうか?

Mr.XRAYさんのサンプルも参照させて頂きましたが、FireMonkeyのBitmapのPixelFormat設定に関して、未だ、見つけられていません。

何か見当違いの事をやっているでしょうか?

よろしくお願いします。


Mr.XRAY  2017-02-07 20:12:08  No: 48525

FireMonkey では,VCL のように直接 TBitmap のピクセルを操作する方式ではありません.
まず,TBitmap.Map で TBitmapData にピクセルのデータをマップ (ダンプ) します.
そして,TBitmapData を操作します.
処理が終了したら,TBitmap.Unmap を実行します.すると TBitmap が処理後の内容になります.

FireMonkey TBitmap TBitmapData PixelFomat 
FireMonkey TBitmap TBitmapData PixelFomat Map

等で検索してみてください.TBitmapData の操作例があると思います.
FireMonkey の TBitmap, TBitmapData には Scanline 相当はありません.
ネットを検索すると,Scanline 相当のコードを掲載している方がいます.


Mr.XRAY  2017-02-07 21:07:21  No: 48526

>Mr.XRAYさんのサンプルも参照させて頂きましたが、FireMonkeyのBitmapのPixelFormat設定に関して、未だ、見つけられていません。 

私のサイトには PixelFormat のサンプルはありません.必要性も感じていません.
というより,基本的に FireMonkey のサンプルは掲載しない方針です.
一部掲載しているのは,コミュニティの場できになったからです.

で肝心の PixelFormat ですが,FireMonkey はマルチデバイス開発用のフレームワークです.
PixelFormat はデバイス依存があるようです.
おそらく,ピクセル単位で処理することになるではないかと予想しています.

FireMonkey は画像効果の機能は豊富ですが,減色などの機能は考えられてはいないかも知れません.
頑張ってください.
うまくいけば,yTake さんが,本邦初のサンプルコードをここに掲載することにるかも知れません.


Mr.XRAY  2017-02-07 21:53:22  No: 48527

今後 FireMonkey で開発する際,以下の記事が参考になると思います.
山本さんの記事は,一番下に前の記事への移動ができます.かなりあります.
参考までに.

[Delphi (FireMonkey) によるテクニック&アルゴリズム]
http://ht-deko.com/techalgof.html

[FireMonkey Archives | 山本隆の開発日誌] 
http://www.gesource.jp/weblog/?tag=firemonkey


yTake  2017-02-07 22:22:40  No: 48528

Mr.XRAYさん
ありがとうございます。

Bitmapの操作がVCLと違う事は少しずつ分かってきました。
Pixel毎に操作を行うにはご案内の通りBitmapをMapして(アクセス許可を得る?)操作(SetPixel、GetPixel)後Unmapする(確定する?描画する?)
と言うところまで、辿り着いています。
ただし、PixelFormatの設定についての言及は見つかっていません。

PixelFormatを設定していないためか、それなりにBitmapへ書き込んでも、何も表示されません。
あるいは、BitmapをImageにコピーする(DrawBitmap)が間違っているのか、、、

例、
    bmp0 :=  TBitMap.Create();
//    bmp.PixelFormat.BGR;
    bmp0.Width :=  xsize;
    bmp0.Height  :=  ysize;
    bmp0.Map( TMapAccess.Write, vBitMapData );
    for j := 0 to ysize - 1 do
    begin
        for i := 0 to xsize - 1 do
        begin
            grey  :=  _ARY[ i, j ].disp;    //8ビット化したPixelデータ
            vPixelColor :=  grey        +
                            grey shl  8 +
                            grey shl 16 ;
            vBitMapData.SetPixel( i, j, vPixelColor );
        end;
    end;
    bmp0.Unmap( vBitMapData );
その後、
Image1.Canvas.DrawBitmap( bmp0,  src, dst, 1 );  //Image1にBmp0を描画させているつもり

FiewMonkey関連の参照をありがとうございます。

ScanLine相当の操作も必要かもしれません。

引き続き、検討してみます。

皆さんの参考になる様なサンプルを提示出来る様がんばってみます。


tor  2017-02-07 22:57:19  No: 48529

これで解決なのかよくわからない&ざっとヘルプを読んだだけですが、
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサミテヲサコスヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサォヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサクヲサォヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサアカヲササヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサツヘトョモミィヲサャヲサャヲサミテヲサゥサヲサ

ヤツトョモミの第三引数はヤチテで……
コッッョョッフッリナカッッニヘリョヌョヤツト
ヤチテはヲサチ(透明度)ャヲサメャヲサヌャヲサツヲサのエチャンネルで構成されます。
コッッョョッフッリナカッッモョユノヤョヤチテ

今だとメヌツしか設定していなくて、チスーだから透明になってしまっているのではないでしょうか?

なお、モミで直接色を指定する分には、内部表現が何であっても関係ないのでミニにこだわる必要はないと思います。
スススススススススススススススススススススススススススススススススススススススス
ニコ yヤ
トコ イーアキッーイッーキィ火ゥ アキコウアコイイ  書込者ノト:ロ 「「    ン

さん
ありがとうございます。

確かにアルファチャンネルが上位ビットに割り当てられている様です。

ヲサヲサヲサヲサミテヲサコスヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサォヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサクヲサォヲサ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサアカヲサォ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサ、ニニーーーーーーサヲサ
ヲサヲサヲサヲサツヘトョモミィヲサャヲサャヲサミテヲサゥサヲサ

と、してみましたが、依然として何も描画されません。

ヤノでのョトツの使い方の問題かもしれません。
直接、テへ描画ィニチゥしてみましたが、やはり、何も表示されません。

一応、閉めてしまいましたので、解決できなければ、追って別スレッドを立てると思います。

ありがとうございました。
スススススススススススススススススススススススススススススススススススススススス
ニコ yヤ
トコ イーアキッーイッーキィ火ゥ アキコウオコイケ  書込者ノト:ロ 「「    ン

さん

直接、モミで書き込む場合にはミニは関係ないとの事、ご指摘ありがとうございます。

了解しました。
スススススススススススススススススススススススススススススススススススススススス
ニコ ヘョリメチル
トコ イーアキッーイッーキィ火ゥ アケコエエコオエ  書込者ノト:ロ 」。ァ  ン

スミマせん.
スレッドを長くしておいて,今更言うのもなんですが,
今,最初の質問を読み返してみたら,もしかして,

ヲサ一つのヤノコンポーネントに複数のヤツヘ画像を切り替えて表示する事を実現します。

ということをやりたいということなのでしょうかヲサソ
もし,そうでしたら,今までのレスは私の勘違いです.謝ります.
スススススススススススススススススススススススススススススススススススススススス
ニコ ヒマホ
トコ イーアキッーイッーキィ火ゥ イウコイーコオカ シ  スュアセシ中級者セ シッニセシノヘヌ ス「コッッョョョッッイョ「 ス「ー「セ 書込者ノト:ロ ヲィヲ ン

ミニの件はヨテフとは異なるという事で、それはとりあえず置いておいて、
何も表示されないというのはおかしいですね。
もしかして、ウトフォーム上(ヲサあるいはヲサヨウト上ヲサ)にヤノコンポーネントを
置いたりしていませんか?
これやってもコンパイルエラーにはならず、表示は行われません。

もしウト上に置くのなら、ヤフウトコンポーネントを置いて「子」としてヤノを
配置するか、ヤノウトコンポーネントを使う事で表示されるようになります。
スススススススススススススススススススススススススススススススススススススススス
ニコ ヘョリメチル
トコ イーアキッーイッーキィ火ゥ イウコエエコーウ  書込者ノト:ロ 「「「。 ン

また勘違いかも知れませんが,コードを書いておきます.
ディスクから画像ファイルを読み出して,ヤノヲサに表示します.
動作確認はヲサラヲサキヲサユカエィモミアゥヲサォヲサトヲサリナキヲサミヲサです.

ヲサヤニアョツイティモコヲサヤマゥサ

ヲサヲサフツヲサヲサヲサコヲサヤツサ
ヲサヲサフモメヲサヲサコヲサヤメニサ
ヲサヲサフトメヲサコヲサヤメニサ

ヲサヲサフツヲサコスヲサヤツョテサ
ヲサヲサ
ヲサヲサヲサヲサッッ画像を読み込む
ヲサヲサヲサヲサフツョフニニィァモ゜ツョァゥサ
ヲサヲサヲサヲサッッヤノのビットマップ生成
ヲサヲサヲサヲサノアョツヲサコスヲサヤツョティヤィノアョラゥャヲサヤィノアョネゥゥサ

ヲサヲサヲサヲサノアョツョテョツモサ

ヲサヲサヲサヲサッッ描画領域設定
ヲサヲサヲサヲサフモメヲサヲサコスヲサメニィーャヲサーャヲサフツョラャヲサフツョネゥサ
ヲサヲサヲサヲサフトメヲサコスヲサフモメサ
ヲサヲサヲサヲサッッ描画
ヲサヲサヲサヲサノアョツョテョトツィフツャヲサヲサフモメャヲサフトメャヲサアョーャヲサニゥサ

ヲサヲサヲサヲサノアョツョテョナモサ
ヲサヲサ
ヲサヲサヲサヲサニチホィフツゥサ
ヲサヲササ


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加