AB262を使ってプログラムをしています。
BMPデータを、BLOADで読み込んで
PUT@で、所望の場所に表示させることができました。
しかし、たとえば800*600などの画像を400*300にしたりする
演算方法が分かりません。
BLOAD ”ファイル名”,ポインタ
は分かりましたが、このポインタにあるデータをプリントしたり
操作したりする方法をご存知の方教えてください。
BMPでBLOADしたあとのデータ
Re: BMPでBLOADしたあとのデータ
私の記憶が確かなら、N88BASICでは画像を伸縮できる命令はなかったような・・・。
(なお、プリントの仕方は分かりません。)
たしか、Point関数でドットの値を読み取って、Pset命令で描画する、
という方法を使って手動で伸縮する必要があったかと思います。
しかしそれでは面白くないのでAPIを使って挑戦してみました。
先に結論から言うと失敗でした・・・。
確かに伸縮はできるのですが、なぜか白黒になってしまいます。
(※すみませんが、コメントはかなり省いてます。
必要でしたら言ってください。時間があるときに追記しておきます
→追記しました@6/13)
(なお、プリントの仕方は分かりません。)
たしか、Point関数でドットの値を読み取って、Pset命令で描画する、
という方法を使って手動で伸縮する必要があったかと思います。
しかしそれでは面白くないのでAPIを使って挑戦してみました。
先に結論から言うと失敗でした・・・。
確かに伸縮はできるのですが、なぜか白黒になってしまいます。
(※すみませんが、コメントはかなり省いてます。
必要でしたら言ってください。時間があるときに追記しておきます
→追記しました@6/13)
テストコードはこちら。 [ここをクリックすると内容が表示されます]
AB2.59で確認。コード: 全て選択
#include <api_gdi.sbp>
#include <api_window.sbp>
Dim pBmp As Long
Dim hWnd As Long
Dim hDC As Long
Dim hdcDest As Long
Dim hdcSrc As Long
Dim pBmpCnvrt As Long
Dim lpBITMAP As BITMAP
Dim nWidth As Long
Dim nHeight As Long
Dim r As Long
Bload "画像のパス", pBmp
Put@( 0,0 ), pBmp, PSet
'以下、WinAPIを用いて挑戦!
'※ハンドル=識別子=区別するための名前みたいなもの。
hWnd = OwnerWnd() 'N88BASICの窓(プロンプト窓)のハンドルを得る。
hDC = GetDC( hWnd ) '窓のデバイスコンテキスト(=画用紙とか思って下さい。)を得る。
hdcSrc = CreateCompatibleDC( hDC ) 'メモリデバイスコンテキストを生成(=同じ大きさ紙質の画用紙とでも思ってください)。
hdcDest = CreateCompatibleDC( hDC ) 'もう一枚メモリデバイスコンテキスト生成。
GetObject( pBmp, Len(lpBITMAP), lpBITMAP ) 'ビットマップの情報をBITMAP構造体へ格納。
nWidth = lpBITMAP.bmWidth 'BITMAP構造体から画像の横幅を得る。
nHeight = lpBITMAP.bmHeight BITMAP構造体から画像の縦幅を得る。
pBmpCnvrt = CreateCompatibleBitmap( hdcDest, nWidth, nHeight ) '互換なビットマップを生成
SelectObject( hdcSrc, pBmp ) 'ビットマップとデバイスコンテキスト(以下DC)をくっつける。
SelectObject( hdcDest, pBmpCnvrt ) 'ビットマップとDCを結合(=DCに描画すると、それがビットマップに記録されることになる。)
r = StretchBlt( hdcDest, 0, 0, nWidth*0.5, nHeight*0.5, hdcSrc, 0, 0, nWidth, nHeight, SRCCOPY ) 'DCからDCへ画像を伸縮コピー(実質、ビットマップからビットマップへコピー)
DeleteDC( hdcSrc ) 'DCを破棄(自分で生成したものは自分で削除)。
ReleaseDC( hWnd, hDC ) 'DCを破棄(窓から直に得たものだけは、書式が違う)。
debug
'BitBlt( hDC, 0,nHeight+10, nWidth*0.5, nHeight*0.5, hdcDest, 0, 0, SRCCOPY ) '伸縮せずに画像をコピー。下記のPutと一緒の結果。
DeleteDC( hdcDest ) 'DCを破棄(コレをしないと、結合されているビットマップをPUT@など他の場所で使えない)。
Put@( 0,nHeight+10 ), pBmpCnvrt, PSet
debug
DeleteObject( pBmpCnvrt ) 'ビットマップを破棄。
'以下、普通にPoint+Psetで。
Dim x As Long
Dim y As Long
Dim c As Long
For y=0 To nHeight
For x=0 To nWidth
c = Point( x, y )
Pset( nWidth+10 + x*0.5, nHeight+10 + y*0.5 ), c
Next
Next
End
最後に編集したユーザー 淡幻星 [ 2006年6月13日(火) 13:31 ], 累計 1 回
泣)すばらしい!ありがとうございます。
BASICの昔の書き方からなかなか脱出できずに困っていますが
淡幻星先生のコードを拝見して勉強してみます。
当方は、画像の伸縮ではないのですが、特定な区間の画像を表示しなおしたり、データを変更したりしてみたいのです。
今は、ポインタ(ですか?)という格納番地の先頭だけを指示して読み込みと表示ができるだけですが、実際、その番地以降に格納されたデータを計算したり、その結果を眺めたりしたいのです。
これすなわち、ポインタ(は理解したつもりなのですが)の次の使い方の学習になると思うんです。
ここに書かれているみなさんは、もう当たり前に知っていることが多いと思いますが、多くのページのコードを眺めて、私のように推測しながら勉強している人もいると思います。
的確な質問方法や、専門用語すら、まだいまひとつで、みなさんにご迷惑をおかけするかもしれませんが、ぜひ今後も暖かい目で見守っていただけますと幸いです。
ぜひご連絡先を伺いたいです。
淡幻星先生ありがとうございます。
草々
淡幻星先生のコードを拝見して勉強してみます。
当方は、画像の伸縮ではないのですが、特定な区間の画像を表示しなおしたり、データを変更したりしてみたいのです。
今は、ポインタ(ですか?)という格納番地の先頭だけを指示して読み込みと表示ができるだけですが、実際、その番地以降に格納されたデータを計算したり、その結果を眺めたりしたいのです。
これすなわち、ポインタ(は理解したつもりなのですが)の次の使い方の学習になると思うんです。
ここに書かれているみなさんは、もう当たり前に知っていることが多いと思いますが、多くのページのコードを眺めて、私のように推測しながら勉強している人もいると思います。
的確な質問方法や、専門用語すら、まだいまひとつで、みなさんにご迷惑をおかけするかもしれませんが、ぜひ今後も暖かい目で見守っていただけますと幸いです。
ぜひご連絡先を伺いたいです。
淡幻星先生ありがとうございます。
草々
なるほど。
前略 淡幻星先生
下記コードをひたすら眺めています。
「 '以下、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に、なかなか入り込めず困っていましたが、分割して使い方を
実験してみます。
ありがとうございました。
また、間違いなどございましたら、御教示願います。
下記コードをひたすら眺めています。
「 '以下、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に、なかなか入り込めず困っていましたが、分割して使い方を
実験してみます。
ありがとうございました。
また、間違いなどございましたら、御教示願います。
Re: なるほど。
「先生」ですか?
そんなこと言われたら、舞い上がって尻尾をふって喜びますよ♪(あれば)
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という手もありますか。
今思い出しました^^; 直リンク可とのことなので、こちらです。)
そんなこと言われたら、舞い上がって尻尾をふって喜びますよ♪(あれば)
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ユーザー
・RS-232Cを使うことができるので、手放せません。
・AB4をおすすめということで、試してみようと思いました。
・RADツールを見ていて、感動してたのですが、これからAB4を勉強します。
実は、まだご指導の内容で、問題は解決しておりません。
結局のところ、画像をGETして、表示する程度のことはできますが。
画像データそのものを、メモリ上で展開して、一部書き換えるような
作業は、結局できません。
デバイスコンテキストのあたりも、おまじない的にこうすればいいんだというのは
なんとなく分かりましたが、たとえば下記のようなことはどうすればいいでしょう?
1)800*600の画像がある。
2)そのうちの15*15の画像をクリッピングする。
3)その特定の15*15のカラー情報を平均した1個の値を得る。
もちろんPOINT関数を使わずにです。
前回のコードで、X*0.5,Y*0.5で描画した項がありましたが
これで出来上がった画像(描画時圧縮)と、色平均化圧縮は結果が違うと
思うんですがいかがでしょうか?
よろしくご教示お願いいたします。
・AB4をおすすめということで、試してみようと思いました。
・RADツールを見ていて、感動してたのですが、これからAB4を勉強します。
実は、まだご指導の内容で、問題は解決しておりません。
結局のところ、画像をGETして、表示する程度のことはできますが。
画像データそのものを、メモリ上で展開して、一部書き換えるような
作業は、結局できません。
デバイスコンテキストのあたりも、おまじない的にこうすればいいんだというのは
なんとなく分かりましたが、たとえば下記のようなことはどうすればいいでしょう?
1)800*600の画像がある。
2)そのうちの15*15の画像をクリッピングする。
3)その特定の15*15のカラー情報を平均した1個の値を得る。
もちろんPOINT関数を使わずにです。
前回のコードで、X*0.5,Y*0.5で描画した項がありましたが
これで出来上がった画像(描画時圧縮)と、色平均化圧縮は結果が違うと
思うんですがいかがでしょうか?
よろしくご教示お願いいたします。
Re: AB262ユーザー
すみません。
ちょっと時間が無いので簡単に。
プロンプト窓への描画に拘らないのであれば、(NORMAL窓への描画になります)解決できます。
というか、前回の縮小はものすごく手抜きですし^^;
ちょっと時間が無いので簡単に。
AB2で出来ますが、プロンプト窓への出力の仕方が私も分かりません(白黒になる理由が分からない)。> 1)800*600の画像がある。
> 2)そのうちの15*15の画像をクリッピングする。
> 3)その特定の15*15のカラー情報を平均した1個の値を得る。
>
> もちろんPOINT関数を使わずにです。
プロンプト窓への描画に拘らないのであれば、(NORMAL窓への描画になります)解決できます。
はい、当然違います。> 前回のコードで、X*0.5,Y*0.5で描画した項がありましたが
> これで出来上がった画像(描画時圧縮)と、色平均化圧縮は結果が違うと
> 思うんですがいかがでしょうか?
というか、前回の縮小はものすごく手抜きですし^^;