BMPでBLOADしたあとのデータ

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
いとちゃん

BMPでBLOADしたあとのデータ

#1 投稿記事 by いとちゃん »

AB262を使ってプログラムをしています。

BMPデータを、BLOADで読み込んで
PUT@で、所望の場所に表示させることができました。

しかし、たとえば800*600などの画像を400*300にしたりする
演算方法が分かりません。

BLOAD ”ファイル名”,ポインタ

は分かりましたが、このポインタにあるデータをプリントしたり
操作したりする方法をご存知の方教えてください。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: BMPでBLOADしたあとのデータ

#2 投稿記事 by 淡幻星 »

私の記憶が確かなら、N88BASICでは画像を伸縮できる命令はなかったような・・・。
(なお、プリントの仕方は分かりません。)

たしか、Point関数でドットの値を読み取って、Pset命令で描画する、
という方法を使って手動で伸縮する必要があったかと思います。


しかしそれでは面白くないのでAPIを使って挑戦してみました。
先に結論から言うと失敗でした・・・。
確かに伸縮はできるのですが、なぜか白黒になってしまいます。
(※すみませんが、コメントはかなり省いてます。
  必要でしたら言ってください。時間があるときに追記しておきます
  →追記しました@6/13) AB2.59で確認。
最後に編集したユーザー 淡幻星 [ 2006年6月13日(火) 13:31 ], 累計 1 回
いとちゃん

泣)すばらしい!ありがとうございます。

#3 投稿記事 by いとちゃん »

BASICの昔の書き方からなかなか脱出できずに困っていますが

淡幻星先生のコードを拝見して勉強してみます。

当方は、画像の伸縮ではないのですが、特定な区間の画像を表示しなおしたり、データを変更したりしてみたいのです。

今は、ポインタ(ですか?)という格納番地の先頭だけを指示して読み込みと表示ができるだけですが、実際、その番地以降に格納されたデータを計算したり、その結果を眺めたりしたいのです。

これすなわち、ポインタ(は理解したつもりなのですが)の次の使い方の学習になると思うんです。

ここに書かれているみなさんは、もう当たり前に知っていることが多いと思いますが、多くのページのコードを眺めて、私のように推測しながら勉強している人もいると思います。

的確な質問方法や、専門用語すら、まだいまひとつで、みなさんにご迷惑をおかけするかもしれませんが、ぜひ今後も暖かい目で見守っていただけますと幸いです。


ぜひご連絡先を伺いたいです。

淡幻星先生ありがとうございます。

草々
いとちゃん

なるほど。

#4 投稿記事 by いとちゃん »

前略 淡幻星先生

下記コードをひたすら眺めています。

 「 '以下、WinAPIを用いて挑戦! 」 というREM文が、いいですね。
API使ってやってみなヨ! がんばります。かっこよすぎです。



hWnd = OwnerWnd()
↑インクルードさえしておけば、この変数(ポインタ)で、コールするような感じで
使えるんですね。

hDC = GetDC( hWnd )
↑入れ子なのでしょうか。ウインドウを決めうちして、そこにGetDC。
リファレンスみてみます。


hdcSrc = CreateCompatibleDC( hDC )
hdcDest = CreateCompatibleDC( hDC )

GetObject( pBmp, Len(lpBITMAP), lpBITMAP )
↑このパラメータについても、リファレンスみてみます。
BMPポインタと、文字数、あとなんでしょう。

nWidth = lpBITMAP.bmWidth '画像横
nHeight = lpBITMAP.bmHeight '画像縦

ここまでくれば、個々の画像幅と高さの情報がもらえるんですね。
この情報も知りたかったので、良かったです。

APIに、なかなか入り込めず困っていましたが、分割して使い方を
実験してみます。


ありがとうございました。

また、間違いなどございましたら、御教示願います。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: なるほど。

#5 投稿記事 by 淡幻星 »

「先生」ですか?
そんなこと言われたら、舞い上がって尻尾をふって喜びますよ♪(あれば)


N88BASICでない(Put@,Get@を使わない)画像の扱いに関しては
私も苦労しました(^^;)
デバイスコンテキストとか、コンパチブル~だの、オブジェクトだの、
最初は訳分からないですよね。苦労のほど、察します。


一応、前回のコードにコメントを追記しておきました。
参考までにどうぞ。
それから、
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=138
からダウンロードできるAB掲示板の全過去ログで、
「PUT@ AND Blt」でキーワード検索すると引っかかるログが、
Put@などとWinAPIでの画像扱い(GDI)の関連を理解するのに
役立つかもしれません(私自身は知っている目線で見てしまうのでなんとも^^;)


> データを変更したりしてみたいのです。
手前味噌ですが、
輝度補正などするために、画像データを簡単に弄くるクラスを作ってたりします。
もっとも、AB4限定で、かつ投稿のものにはまだバグが少々・・・すみません^^;。
(そのうち修正版を追加しようとは思っています)

> この変数(ポインタ)で、コールするような感じで
念のため。
「変数=ポインタ」ではないです。
「変数⊃ポインタ」です。(細かく言えばこれも厳密ではないですが)

> ぜひご連絡先を伺いたいです。
メールアドレス、という意味でしょうか?
下記の「情報」の欄にある「MSNメッセンジャー」が
メールアドレスを意味して(兼ねて)います。

> ポインタ(ですか?)
その理解でほぼ合ってます。
(正確には「ビットマップハンドル」なのですが・・・そこを突っ込まれると私も怪しいです^^;)

AB2ユーザーを見かけると嬉しくなりますね。
私もいまだにAB2を使ってますので(^_^;)
しかし、画像を扱うのであれば処理速度の面で
AB4(AB3を含む)の方が圧倒的なのも事実です。
AB4でもN88BASICモードは(互換性が弱くなったとはいえ)健在ですし、
どうしても、という不都合が無ければAB4への移行、もしくは併用を
選択肢として考えてみてはいかがでしょうか?
(他には、AB2+NanasiさんのNALib.dllという手もありますか。
 今思い出しました^^; 直リンク可とのことなので、こちらです。)
いとちゃん

AB262ユーザー

#6 投稿記事 by いとちゃん »

・RS-232Cを使うことができるので、手放せません。

・AB4をおすすめということで、試してみようと思いました。

・RADツールを見ていて、感動してたのですが、これからAB4を勉強します。


実は、まだご指導の内容で、問題は解決しておりません。


結局のところ、画像をGETして、表示する程度のことはできますが。

画像データそのものを、メモリ上で展開して、一部書き換えるような
作業は、結局できません。


デバイスコンテキストのあたりも、おまじない的にこうすればいいんだというのは
なんとなく分かりましたが、たとえば下記のようなことはどうすればいいでしょう?


1)800*600の画像がある。
2)そのうちの15*15の画像をクリッピングする。
3)その特定の15*15のカラー情報を平均した1個の値を得る。

もちろんPOINT関数を使わずにです。

前回のコードで、X*0.5,Y*0.5で描画した項がありましたが
これで出来上がった画像(描画時圧縮)と、色平均化圧縮は結果が違うと
思うんですがいかがでしょうか?


よろしくご教示お願いいたします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: AB262ユーザー

#7 投稿記事 by 淡幻星 »

すみません。
ちょっと時間が無いので簡単に。
> 1)800*600の画像がある。
> 2)そのうちの15*15の画像をクリッピングする。
> 3)その特定の15*15のカラー情報を平均した1個の値を得る。
>
> もちろんPOINT関数を使わずにです。
AB2で出来ますが、プロンプト窓への出力の仕方が私も分かりません(白黒になる理由が分からない)。
プロンプト窓への描画に拘らないのであれば、(NORMAL窓への描画になります)解決できます。
> 前回のコードで、X*0.5,Y*0.5で描画した項がありましたが
> これで出来上がった画像(描画時圧縮)と、色平均化圧縮は結果が違うと
> 思うんですがいかがでしょうか?
はい、当然違います。
というか、前回の縮小はものすごく手抜きですし^^;
返信する