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件)
- 最新から表示
- 回答順に表示
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から作成しましょう
ありがとうございます。
残念ながら、私の力不足のためか、お教えいただいた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()関数を、今あるプログラムに使おうとすると、どうやって使ってよいのかわからないので足踏み状態です。
引き続き、ご教示お願いします。
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
のマクロで囲えば使えるようになります ・・・
No.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)で置き換わる訳です。
ありがとうございました。
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);
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です。バイナリ形式で保存されたWindows Bitmap形式の画像ファイルを読み込み、 3 2023/07/19 14:58
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- その他(ソフトウェア) 画像のファイル形式、拡張子が変わると、性能が変わると思うのですが、ファイル名の「jpg、png、do 8 2022/08/10 13:37
- PDF PDFに精通した方に質問。JPEGファイル群を一つのPDFファイルにするときの容量変化について 6 2023/07/23 19:06
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
imgctl.dllを使って読み込んだ画像ファイルをTransparentBltで画く方法
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
-
4
LoadImage関数について(VC++)
C言語・C++・C#
-
5
ビットマップ(bmp)形式で背景を透過にできる?
画像編集・動画編集・音楽編集
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
このプログラミング誰か教えて...
-
ファイル読み込みとmap処理
-
boost::lexical_castで16進数文...
-
enumの値から定義名を文字列化...
-
Linux Ubuntu19.10でQt5.14.1の...
-
ハミング符号の解読について
-
セグメンテーションフォルトが...
-
#include "fstream.h"
-
C言語からgnuplot呼び出し
-
vectorの中にmap
-
Haru PDF Library
-
C++で、テキストファイルを一行...
-
C言語のポインターで詰まっている
-
snprintfが使用できない。
-
winpcapを用いたプログラミング
-
C言語プログラミングにて、関数...
-
JPEGやPNGが読めるLoadImage関数
-
Vectorのポインタが入ったvector
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
空ENTERの判別
-
なぜ、C++の標準ヘッダをインク...
-
【C++】ヘッダ内でstringを格納...
-
C++での <iostream.h>と<iostre...
-
#include "fstream.h"
-
#define中の#のエスケープ
-
JPEGやPNGが読めるLoadImage関数
-
リモートデスクトップの接続元I...
-
CStringとString
-
string型のフォーマット書式指...
-
std::map の const 修飾について
-
VHDLのsignedとunsignedの違いは?
-
このプログラミング誰か教えて...
-
構造体配列のvectorへの変換と...
-
指定した文字を削除したい
-
構造体に決められた文字列を入...
おすすめ情報