プロが教えるわが家の防犯対策術!

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()といった関数を探しています。どこかにありますか?

A 回答 (3件)

コンパイラを VC.NET2008に変更してもいいなら検討してみましょう



VC.NET2008なら無償版の Express Editionもあります
WinAPI開発用のPlatformSDKっも付いているようですし
GDIPlusも使えます … C++での使用が基本のようですが ・・・

BCC5.0/55などは結構古めの処理系ですから新しいSDKと相性が余りよくない面があるようです

この回答への補足

別の質問で問題が解決しましたので、報告します。

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)で置き換わる訳です。
ありがとうございました。

補足日時:2008/06/02 22:38
    • good
    • 0
この回答へのお礼

redfox63さん、何回も回答ありがとうございます。

進捗状況ですが、
http://www.geocities.jp/ccfjd821/purogu/wpe-ji9. …
を参考に、以下の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);
}

お礼日時:2008/05/31 08:25

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
のマクロで囲えば使えるようになります ・・・
    • good
    • 0

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から作成しましょう
    • good
    • 0
この回答へのお礼

ありがとうございます。
残念ながら、私の力不足のためか、お教えいただいた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()関数を、今あるプログラムに使おうとすると、どうやって使ってよいのかわからないので足踏み状態です。

引き続き、ご教示お願いします。

お礼日時:2008/05/28 22:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています