dポイントプレゼントキャンペーン実施中!

こんにちわ、Visal Studio 2005(C++)のフォームアプリケーションでプログラミングしているものです。LoadImage関数を使って、読み込んだ画像を指定のサイズにリサイズ?したいのですが、LoadImage関数の使い方がよくわかりません。『プログラム上で画像作成』という質問とほぼ質問内容がかぶっているのですが、そちらの回答を見て実効してもうまくいきません。
そちらで書いてあることは、たとえばピクチャーボックスに画像を表示させたい場合なのですが、
pictureBox1->Image = ::LoadImage(file/*ファイル名*/,x/*指定したx座標*/,y/*指定したy座標*/); 
といった感じでできるらしいのですが、::の後にLoadImageがでてきません。これは何かこの記述をする前に、さらに記述が必要なのでしょうか?
その後には、プロパティを開いて共通言語ランタイムサポートを「共通言語ランタイムサポート(/clr)」に設定すればできるとも書いてありますができません。
お分かりの方がいましたら回答お願いします。

A 回答 (5件)

FormのPaintイベントに描画コードを記述するのであれば


this->Invalidate();
などで フォームの再描画を促さなくてはいけません

pictureBox1->Invaliedate();
を実行するなら PictureBoxのPaintイベントを記述しましょう

大きさを変更した画像を保存するには
保存用のBitmapオブジェクトが必要です

Bitmap ^bmpsave = gcnew Bitmap( 200, 200 );
Graphics ^gSave = Graphics::FromImage( bmpsave );
gSave->DrawImage( b, 0, 0, 200, 200 );
delete gSave;
bmpsave->Save("ファイルパス", ImageFormat::Jpeg );
delete bmpsave;
といった具合でしょう ・・・
    • good
    • 0
この回答へのお礼

両方ともできました^^

プログラムだけで画像を作る方法について長い間考えていたので、すごく助かりました。
本当にありがとうございます。

お礼日時:2009/01/15 19:44

 既に正しい回答が出されていますので、其方に沿った方が無難だと思います。


 一応、訊ねられた事に返答だけさせて頂きます。

>>・コマンド ライン オプション '/clr:pure' は、プリコンパイル済みヘッダーが作成されたときのものと異なります。
・'/D_M_CEE_PURE=001' がプリコンパイル済みヘッダーに定義されていますが、現在のコンパイル処理には定義されていません。
・C:\Program Files\Microsoft Platform SDK\Include\objidl.h(7583) : error C2872: 'IDataObject' : あいまいなシンボルです。
 一旦クリーンしてからビルドして見て下さい。

>>もしlena.bmpという画像を100*100のサイズにしたかったら、
::LoadImage(NULL, "c:~lena.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
ということでよろしいのでしょうか?

HBITMAP hBmp = ::LoadImage(NULL, "c:~lena.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
System::Drawing::Bitmap^ bmp = System::Drawing::Bitmap::FromHbitmap(System::IntPtr(hBmp));
::DeleteObject(hBmp);

 以後bmpクラスを使う事に成ります。
 "c:~lena.bmp"と直接入力するのなら、其れで良いと思いますが、System::String^から渡す場合は、マーシャリングが必要です。
 『プログラム上で画像作成』URLを参考にして見て下さい。
    • good
    • 0
この回答へのお礼

せっかく長々と詳しく教えていただいたのにすみません、今回は別の方法でできてしまいました。

クリーンすることでエラーもなくなりました^^
こちらの方法も使う機会があると思うので、そのときにまた使ってみようと思います。
詳しい説明ありがとうございました。

お礼日時:2009/01/15 19:51

適切なPaintイベントを記述してやれば 大きさも自由に描画できますよ



Formのメンバーに
Bitmap^ m_bmp;
などと記述しておきます

何かのイベントで
m_bmp = (Bitmap^)Bitmap::FromFile("ファイルパス");
pictureBox1->Invalidate();
といった具合にBitmapオブジェクトを生成してPaintイベントを呼ぶようにしておきます

FormのPaintやPictureBoxのPaintイベントで
if ( m_bmp == nullptr )
return;
e->Graphics->DrawImage( m_bmp, 0, 0, 640, 480 );
などと記述すればいいでしょう
または CreateGraphicsなどでGraphicsオブジェクトを生成して描画しましょう

プラットフォームSDKのLoadImageはビットマップのハンドルを返すだけです
Bitmapオブジェクトには成りえないのでそのままでは使い物になりません
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
こちらの方法から先にやらせていただきました^^;

Bitmap^ b;で宣言を行い、ペイントイベントで以下のようにしました。
private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
if(b){
e->Graphics->DrawImage(b,0,0,200,200);
}
}

また、ボタンのクリックイベントで、
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
b = (Bitmap^)Bitmap::FromFile("C:/~lena.bmp");
pictureBox1->Invalidate();
}
とやっても出力されなかったのですが、ロードイベントで、
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
b = (Bitmap^)Bitmap::FromFile("C:/~lena.bmp");
pictureBox1->Invalidate();
}
のようにしたら(0,0)座標に表示されました。これはpicture1に出力できないのでしょうか?

また、この補正された画像は指定したサイズのままで保存はできるのでしょうか?

お礼日時:2009/01/14 19:53

C++/CLIでやるなら Bitmapオブジェクトを使ったほうが簡単でしょう



pictureBox1->Image = Bitmap::FromFile("ファイルパス");
といった具合です ・・・
    • good
    • 0
この回答へのお礼

こんにちわ、回答ありがとうございます。

そうですね、
pictureBox1->Image = Bitmap::FromFile("ファイルパス");
だと指定された画像ファイルが表示されるんですけど、サイズの指定ができないんですね。
サイズの指定をしたいのでLoadImage関数について知らべています。
難しいようで、他に方法があれば良いのですが。

お礼日時:2009/01/13 16:29

 こんばんは。



 ああ、それ、私が過去にした回答です(はっはっは)。
 http://oshiete1.goo.ne.jp/qa4558108.html

 呼べませんか? う~む。先ず、
>>Visal Studio 2005(C++)のフォームアプリケーションでプログラミング
 と有りますが、ExpressEditionの事でしょうか?(簡単な話、マイクロソフトのHPからダウンロードして来たモノ)
 もしそうであるならば、別途PlatformSDKをダウンロードしてインストールしないと、LoadImageの様なAPIは使用出来ません。
 コレです。設定等は、検索すれば出て来ます。
 http://www.microsoft.com/downloads/details.aspx? …

 で、肝心な呼び出し方ですが・・・。
 「LoadImage()API」
 http://msdn.microsoft.com/ja-jp/library/cc364835 …

 例えば、ファイルから読んで、任意のサイズに伸縮させたい場合は、
 lpwstrFileNameはファイル名
 iWidthは望む横幅
 iHeightは望む縦幅
 ::LoadImage(NULL, lpwstrFileName, IMAGE_BITMAP, iWidth, iHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
 と書いて呼び出します。

 後、以下のヘッダーとライブラリをインクルード、リンクする必要が有ります。
 #include<windows.h>
 #pragma comment(lib, "gdi32.lib")

 更にマネージドを使用している時には「プロパティを開いて共通言語ランタイムサポートを「共通言語ランタイムサポート(/clr)」に設定する」必要も有ります。
 必要な局面を簡単に言うと、今手元にあるプログラム内に、
 System::String^
 や
 Form1^
 見たいな単語が出て来ているかどうかです。出てきているのならば、必要と言う事です。
    • good
    • 0
この回答へのお礼

こんにちわ、回答ありがとうございます。

PlatformSDKをインストールして、
http://www.cppdrive.jp/vc/sdk/index.htmlのサイトを参考に設定をして最後いきました。
::の後にもちゃんとLoadImage関数がでてきています。

しかし・・・今度は100個以上のエラーがでてきてしまいます。
例)
・コマンド ライン オプション '/clr:pure' は、プリコンパイル済みヘッダーが作成されたときのものと異なります。
・'/D_M_CEE_PURE=001' がプリコンパイル済みヘッダーに定義されていますが、現在のコンパイル処理には定義されていません。
・C:\Program Files\Microsoft Platform SDK\Include\objidl.h(7583) : error C2872: 'IDataObject' : あいまいなシンボルです。
あいまいと言われましても何をどうなおせばよいのやら・・・。
machongolaさんの教えてくれた設定もすべてやったはずなのですが・・・
他にするべき設定はありますでしょうか?

もしlena.bmpという画像を100*100のサイズにしたかったら、
::LoadImage(NULL, "c:~lena.bmp", IMAGE_BITMAP, 100, 100, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
ということでよろしいのでしょうか?

お礼日時:2009/01/13 20:07

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

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