• 締切済み

JPEGやPNGが読めるLoadImage関数

BCCで、 hBitmapA=(HINSTANCE)LoadImage(hInst,"A.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBitmapB=(HINSTANCE)LoadImage(hInst,"B.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);    : GetObject(hBitmapA,sizeof(BITMAP),&bitmapA); GetObject(hBitmapB,sizeof(BITMAP),&bitmapB);    : のように複数のBMPファイルを読んで、描画しているプログラムがあります。 JPEGファイルやPNGファイルを同様に扱えるように拡張したいのですが、LoadImage関数では、対応していないので、たとえば、LoadImagePng()やLoadImageJpeg()といった関数を探しています。どこかにありますか?

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

コンパイラを VC.NET2008に変更してもいいなら検討してみましょう VC.NET2008なら無償版の Express Editionもあります WinAPI開発用のPlatformSDKっも付いているようですし GDIPlusも使えます … C++での使用が基本のようですが ・・・ BCC5.0/55などは結構古めの処理系ですから新しいSDKと相性が余りよくない面があるようです

usatan2
質問者

お礼

redfox63さん、何回も回答ありがとうございます。 進捗状況ですが、 http://www.geocities.jp/ccfjd821/purogu/wpe-ji9.html を参考に、以下のJPEG用のLoadImage()関数はできました。 後は、PNG用のLoadImage()関数ができれば、今回は取り合えず先に進めます。 なお、このLoadImageJpeg()関数、C++でコンパイルするとエラーになるのでCでしか使えません。私のスキル不足で、C++で動くように変更できません。 >コンパイラを VC.NET2008に変更してもいいなら検討してみましょう BCCからの引越しですね。おっしゃることは尤もなのですが、今までのBCCのプログラムが有効活用できない、つまり、修正して再利用する場合、手間がかかるのがつらいです・・ ----------------------------------- HBITMAP LoadImageJpeg(char File[255]){   OLE_HANDLE hOle;   IStream *iStream=NULL;   IPicture *iPicture;   HGLOBAL hMem;   LPVOID pvData;   DWORD nReadByte=0,nFileSize;   HANDLE hFile;   short type;   hFile=CreateFile(File,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);   nFileSize=GetFileSize(hFile,NULL);   hMem=GlobalAlloc(GMEM_MOVEABLE,nFileSize);   pvData=GlobalLock(hMem); // 確保した領域を固定してデータを読み込む   ReadFile(hFile,pvData,nFileSize,&nReadByte,NULL);   GlobalUnlock(hMem);  // 領域量を増減可能にして、   CloseHandle(hFile);   CreateStreamOnHGlobal(hMem,TRUE,&iStream); // bitmapに変換するためのStreemを作る   OleLoadPicture(iStream,nFileSize,FALSE,           &IID_IPicture,(LPVOID*)&iPicture);   iStream->lpVtbl->Release(iPicture);   iPicture->lpVtbl->get_Type(iPicture,&type);   if(type==PICTYPE_BITMAP){     iPicture->lpVtbl->get_Handle(iPicture,&hOle);   }   return((HBITMAP)hOle); }

usatan2
質問者

補足

別の質問で問題が解決しましたので、報告します。 http://oshiete1.goo.ne.jp/qa4067674.html 解決策の要約: imgctl.dllを使い、 (1) hDIB = ToDIB(ファイル名);でBMP,JPEG,PNGを読み込み、 (2) DIBハンドらから、ビットマップハンドルhBitmapを取得し、 (3) SelectObject(hMin,hBitmap);で、そのビットマップに対するデバイスコンテクストハンドルhMin を作成し、 (4) TransparentBltのパラメタにそのhMinを使って画面に描画する という4ステップで描画する方法です。 つまり、LoadImage関数が(1)(2)で置き換わる訳です。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

GDIPLUSをBCCで使えるようにするには 大変なようです … しかも『Cリンケージ』となると ラッパーDLLを作成しないといけないようです C++リンケージなら typedef unsigned long* ULONG_PTR; typedef unsigned int UINT32; typedef unsigned short* UINT_PTR; typedef unsigned short UINT16; typedef signed short INT16; struct IDirectDrawSurface7; namespace Gdiplus {   namespace DllExports {     #include <gdiplusmem.h>   }   #include <gdiplusBase.h>   #include <gdiplusEnums.h>   #include <gdiplustypes.h>   #include <gdiplusinit.h>   #include <gdiplusPixelFormats.h>   #include <gdiplusColor.h>   #include <gdiplusMetaHeader.h>   #include <gdiplusImaging.h>   #include <gdiplusColorMatrix.h>   #include <gdiplusGpStubs.h>   #include <gdiplusheaders.h>   namespace DllExports {     #include <gdiplusFlat.h>   }   #include <gdiplusBitmap.h>   #include <gdiplusImageCodec.h> } と必要なヘッダーを抜粋してインクリュードします GDIPLUSBitmap.hの 588行付近の inline Bitmap::Bitmap( IN INT width, IN INT height, IN Graphics* target) 関数と GDIPLUSImaging.hの66行付近の MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC") IImageBytes : public IUnknown { public: インターフェース定義を #ifndef __BORLANDC__ #endif のマクロで囲えば使えるようになります ・・・

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

WinAPIbのLoadImageでは PNGは読めません GDI+を使うか フリーのライブラリなどを探しましょう GDI+を使うなら #include <gdiplus.h> をインクリュードして   // アプリケーションの初期化時に   GdiplusStartupInput gdiplusStartupInput;   ULONG_PTR gdiplusToken;   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);   // 画像ファイルの読み込み   Bitmap* image = new Image(L"FakePhoto.jpg");   HBITMAP hbmp = NULL;   Color cl;   image->GetPixel( 0, 0, &cl );   // これでビットマップハンドルを取得します   Status sts = image->GetHBitmap( cl, &hbmp );   // stsが okなら読み込み成功です   // 画像ファイルの後始末   delete image;   // アプリの終了時など GDIPlusの後始末   GdiplusShutdown(gdiplusToken); といった具合に使います インポートライブラリは BCCの付属ユーティリティのimplibなどで GDIPLUS.DLLから作成しましょう

usatan2
質問者

お礼

ありがとうございます。 残念ながら、私の力不足のためか、お教えいただいたGDI+を使うことができません。 機能追加したいプログラムはCで書かれていて、BMPファイルを hBitmapA=(HINSTANCE)LoadImage(hInst,"A.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBitmapB=(HINSTANCE)LoadImage(hInst,"B.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);    : GetObject(hBitmapA,sizeof(BITMAP),&bitmapA); GetObject(hBitmapB,sizeof(BITMAP),&bitmapB); のように読み込んで、 SelectObject(hMin,hBitmap1); BitBlt(hdc,x,y,dx,dy, hMin,0,0,SRCCOPY));  や、 SelectObject(hMin,hBitmap1); TransparentBlt(hdc,x,y,dx,dy, hMin,0,0,dx,dy,RGB(r,g,b)); で使って描画しています。 そこで、 hBitmapB=(HINSTANCE)LoadImagePNG(hInst,"D.PNG"); という関数を、お教えいただいた方法で作ろうとしましたが、うまく作れません。すいません、GDI+をC++ではなく、Cで使いたいのです。どうやったらよいのかお教えください。 また、LoadImagePNG()関数が作れるフリーのライブラリを探したのですが、探し方がうまくないようで、こちらも見つけることができません。ご存知でしたら、ご紹介ください。 私が見つけたのはDXライブラリですが、機能拡張したいプログラムに使おうと思いましたが、使うことができませんでした。 http://l.huu.cc/g/#3 DXライブラリのサンプルプログラムを作ってみると、C言語で簡単に、PNGでもJPEGでもBMPでも表示できるたのですが、そこにあったLoadGraphScreen()関数を、今あるプログラムに使おうとすると、どうやって使ってよいのかわからないので足踏み状態です。 引き続き、ご教示お願いします。

関連するQ&A