はじめまして、吉田と申します。WinME、VB6環境にてプログラミングを
学習しています。
メモリデバイスコンテキスト上に既存のBMP形式のファイルを読み込みた
い(ロードしたい)ため、自分なりに検索や思考を行ってみたのですが方法を
見出すことが出来ません。
ご存知の方がおられましたら御指導をお願いいたします。
WinAPIのGDI関連の話であれば、
LoadBitmap関数でBITMAPハンドルが取れますので、
該当するメモリデバイスコンテキストにSelectObject関数でBITMAPを選択させます。
実際転記する場合は、BitBlt関数(またはStretchBlt関数)をつかってメモリデバイスコンテキストの
内容を転記します。
VBでもっと簡単に出来るかもしれませんけど。
LoadImageなどのAPI関数を使って直接読み込んでもいいし、
CreateDIBSectionやCreateDIBitmapなどで枠を作ってから、
独自にバイナリとして読み込んで、作成したBitmapに中身を
詰め込んでいってもいいでしょうし。
Blueさん、K.J.Kさん、Resをありがとうございます。
BITMAPハンドルを取得できるということで、教えていただいたLoadBitmap関数とLoadImage関数について検索調査してみました。
結果、モジュールやアプリケーションインスタンスからロードする例はいくつか見つけたのですが、既存のBMPファイルをロードするものを見つけることが出来なかったため、LoadBitmap関数の2つの引数に対して何を与えればよいのかがわかりません(第2引数にはファイル名を記述すればよいのではないかと思うのですが)。
自分なりにいろいろ試してはみたのですがうまくいきません。
追加質問となり恐縮ですが、LoadBitmap関数にて既存のBMPファイルをロードする場合の引数について教えていただけないでしょうか。
BMPファイルをロードする場合、
LoadBitmapではなく、LoadImageだね。
先ずは、ここ見て。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_loadimage.asp
> LoadBitmapではなく、LoadImageだね。
ホンマですね。
MSDNにも
> この関数は、LoadImage 関数に取って代わられています。
> この関数の代わりに LoadImage を使ってください。
とありましたね。
# 見ていたところが結構古いサイトだったので。
## いかに使っていないかばればれだ罠。
bmpさん、Blueさん、Resをありがとうございます。
bmpさんに教えていただいたページや自分で検索した内容等を参考にして、
既存のファイル(d:\test.jpg)をロードしてピクチャーボックス(picture1)に
表示させる下記のテストコードを書いてみたのですが、「型が一致しません」と
いうエラーが表示されてしまいます。
よろしければ誤っている部分をご指摘いただけないでしょうか(根本から間違って
いる?)。
Dim lnghDC As Long
Dim lngBMP As Long
lnghDC = CreateCompatibleDC(Picture1.hDC)
lngBMP = LoadImage(0, "d:\test1\LKIF00020a.jpg", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
SelectObject lnghDC, lngBMP
BitBlt Picture1.hDC, 0, 0, 500, 360, lnghDC, 0, 0, SRCCOPY
DeleteDC lnghDC
DeleteObject lngBMP
>「型が一致しません」と
>いうエラーが表示されてしまいます。
具体的にはどの行でエラーが発生するのでしょうか?
ちなみにVBにはLoadPictureステートメントとPaintPictureというメソッドが
用意されていますが、それは知った上でAPIを使用されているんでしょうか?
030さんResをありがとうございます。
>具体的にはどの行でエラーが発生するのでしょうか?
lngBMP = LoadImage(0, "d:\test1\LKIF00020a.jpg", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)
の行で発生します。
>ちなみにVBにはLoadPictureステートメントとPaintPictureというメソッドが
>用意されていますが、それは知った上でAPIを使用されているんでしょうか?
前記のテストコードではPictureBoxを使用していますが、私が実際に行いたいこと
が「ロードした画像データを自動的に(プログラム内で)加工して再度保存する」と
いうことであるため、(非表示で利用するにしても)PictureBoxコントロールを使用
せず全てのプロセスをメモリ上だけで処理したいとためPaintPictureメソッドを利
用できません。
またLoadPictureステートメントの利用に関しては、LoadPictureを使ってPicture
オブジェクトに画像ファイルをロードし、そのHandleをメモリデバイスコンテキス
トに対応させることで一応上記の目的は達することが出来たのですが、この方法を
思いつく前にAPIだけで処理しようとして出来なかったため、後学のためPictureオ
ブジェクトを使用せずに上記の目的を達成できないものかとおもい質問させていた
だいた次第です(Pictureオブジェクトを使用するのがよりVB的であるとは思いますが)。
長文となってしまい恐縮です。
LoadImageの宣言部とIMAGE_BITMAP及びLR_LOADFROMFILEの宣言部を提示してみて下さい。
下記の様になっていますでしょうか?
Public Const IMAGE_BITMAP = 0
Public Const LR_LOADFROMFILE = &H10
Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
あと、提示されたコードではビットマップファイルは読み込めるがJPEGだと
LoadImageが失敗するようです。
>またLoadPictureステートメントの利用に関しては、LoadPictureを使ってPicture
>オブジェクトに画像ファイルをロードし、そのHandleをメモリデバイスコンテキス
>トに対応させることで一応上記の目的は達することが出来たのですが、この方法を
>思いつく前にAPIだけで処理しようとして出来なかったため、後学のためPictureオ
>ブジェクトを使用せずに上記の目的を達成できないものかとおもい質問させていた
>だいた次第です(Pictureオブジェクトを使用するのがよりVB的であるとは思いますが)。
背景了解しました。
JPEG画像を扱うならGDI+でしょうか
http://msdn.microsoft.com/library/en-us/gdicpp/GDIPlus/GDIPlusreference/flatimage.asp?frame=true
を参考にしてみて下さい。
私もGDI+については詳しくないので有識者の方に説明いただければと思います。
030さんに例示していただいた宣言部分と自分の宣言部分を比較した結果、LoadPicture関数の第2引数の型がLong型になっていました。これをString型に変
更し、Bitmapファイルを指定したところ正常に表示することが出来ました。
また、ご指摘いただいたとおりJPEGファイルには適用できませんでしたが、JPEGフ
ァイルに関しては自分なりに更に学習を進める必要を感じますので、このスレッド
は解決とさせていただこうと思います。
みなさん本当にありがとうございました。
ツイート | ![]() |