メモリデバイスコンテキストにBMP形式のファイルを読み込むには?

解決


吉田  2005-11-30 09:34:00  No: 93001

はじめまして、吉田と申します。WinME、VB6環境にてプログラミングを
学習しています。

メモリデバイスコンテキスト上に既存のBMP形式のファイルを読み込みた
い(ロードしたい)ため、自分なりに検索や思考を行ってみたのですが方法を
見出すことが出来ません。
ご存知の方がおられましたら御指導をお願いいたします。


Blue  2005-11-30 09:56:28  No: 93002

WinAPIのGDI関連の話であれば、

LoadBitmap関数でBITMAPハンドルが取れますので、
該当するメモリデバイスコンテキストにSelectObject関数でBITMAPを選択させます。

実際転記する場合は、BitBlt関数(またはStretchBlt関数)をつかってメモリデバイスコンテキストの
内容を転記します。

VBでもっと簡単に出来るかもしれませんけど。


K.J.K.  2005-11-30 20:15:03  No: 93003

LoadImageなどのAPI関数を使って直接読み込んでもいいし、
CreateDIBSectionやCreateDIBitmapなどで枠を作ってから、
独自にバイナリとして読み込んで、作成したBitmapに中身を
詰め込んでいってもいいでしょうし。


吉田  2005-12-01 01:54:08  No: 93004

Blueさん、K.J.Kさん、Resをありがとうございます。

BITMAPハンドルを取得できるということで、教えていただいたLoadBitmap関数とLoadImage関数について検索調査してみました。
結果、モジュールやアプリケーションインスタンスからロードする例はいくつか見つけたのですが、既存のBMPファイルをロードするものを見つけることが出来なかったため、LoadBitmap関数の2つの引数に対して何を与えればよいのかがわかりません(第2引数にはファイル名を記述すればよいのではないかと思うのですが)。
自分なりにいろいろ試してはみたのですがうまくいきません。
追加質問となり恐縮ですが、LoadBitmap関数にて既存のBMPファイルをロードする場合の引数について教えていただけないでしょうか。


bmp  2005-12-01 02:33:08  No: 93005

BMPファイルをロードする場合、
LoadBitmapではなく、LoadImageだね。
先ずは、ここ見て。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_loadimage.asp


Blue  2005-12-01 03:22:07  No: 93006

> LoadBitmapではなく、LoadImageだね。
ホンマですね。
MSDNにも
> この関数は、LoadImage 関数に取って代わられています。
> この関数の代わりに LoadImage を使ってください。
とありましたね。

# 見ていたところが結構古いサイトだったので。
## いかに使っていないかばればれだ罠。


吉田  2005-12-02 08:05:59  No: 93007

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


030  2005-12-02 08:58:14  No: 93008

>「型が一致しません」と
>いうエラーが表示されてしまいます。
具体的にはどの行でエラーが発生するのでしょうか?


030  2005-12-02 09:03:30  No: 93009

ちなみにVBにはLoadPictureステートメントとPaintPictureというメソッドが
用意されていますが、それは知った上でAPIを使用されているんでしょうか?


吉田  2005-12-03 01:48:57  No: 93010

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的であるとは思いますが)。
長文となってしまい恐縮です。


030  2005-12-03 02:38:14  No: 93011

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が失敗するようです。


030  2005-12-03 03:11:00  No: 93012

>また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+については詳しくないので有識者の方に説明いただければと思います。


吉田  2005-12-04 08:06:47  No: 93013

030さんに例示していただいた宣言部分と自分の宣言部分を比較した結果、LoadPicture関数の第2引数の型がLong型になっていました。これをString型に変
更し、Bitmapファイルを指定したところ正常に表示することが出来ました。
また、ご指摘いただいたとおりJPEGファイルには適用できませんでしたが、JPEGフ
ァイルに関しては自分なりに更に学習を進める必要を感じますので、このスレッド
は解決とさせていただこうと思います。
みなさん本当にありがとうございました。


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

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






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