- ベストアンサー
LoadImage関数について(VC++)
こんにちわ、Visal Studio 2005(C++)のフォームアプリケーションでプログラミングしているものです。LoadImage関数を使って、読み込んだ画像を指定のサイズにリサイズ?したいのですが、LoadImage関数の使い方がよくわかりません。『プログラム上で画像作成』という質問とほぼ質問内容がかぶっているのですが、そちらの回答を見て実効してもうまくいきません。 そちらで書いてあることは、たとえばピクチャーボックスに画像を表示させたい場合なのですが、 pictureBox1->Image = ::LoadImage(file/*ファイル名*/,x/*指定したx座標*/,y/*指定したy座標*/); といった感じでできるらしいのですが、::の後にLoadImageがでてきません。これは何かこの記述をする前に、さらに記述が必要なのでしょうか? その後には、プロパティを開いて共通言語ランタイムサポートを「共通言語ランタイムサポート(/clr)」に設定すればできるとも書いてありますができません。 お分かりの方がいましたら回答お願いします。
- みんなの回答 (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; といった具合でしょう ・・・
その他の回答 (4)
- machongola
- ベストアンサー率60% (434/720)
既に正しい回答が出されていますので、其方に沿った方が無難だと思います。 一応、訊ねられた事に返答だけさせて頂きます。 >>・コマンド ライン オプション '/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を参考にして見て下さい。
お礼
せっかく長々と詳しく教えていただいたのにすみません、今回は別の方法でできてしまいました。 クリーンすることでエラーもなくなりました^^ こちらの方法も使う機会があると思うので、そのときにまた使ってみようと思います。 詳しい説明ありがとうございました。
- redfox63
- ベストアンサー率71% (1325/1856)
適切な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オブジェクトには成りえないのでそのままでは使い物になりません
お礼
回答ありがとうございます。 こちらの方法から先にやらせていただきました^^; 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に出力できないのでしょうか? また、この補正された画像は指定したサイズのままで保存はできるのでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
C++/CLIでやるなら Bitmapオブジェクトを使ったほうが簡単でしょう pictureBox1->Image = Bitmap::FromFile("ファイルパス"); といった具合です ・・・
お礼
こんにちわ、回答ありがとうございます。 そうですね、 pictureBox1->Image = Bitmap::FromFile("ファイルパス"); だと指定された画像ファイルが表示されるんですけど、サイズの指定ができないんですね。 サイズの指定をしたいのでLoadImage関数について知らべています。 難しいようで、他に方法があれば良いのですが。
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 ああ、それ、私が過去にした回答です(はっはっは)。 http://oshiete1.goo.ne.jp/qa4558108.html 呼べませんか? う~む。先ず、 >>Visal Studio 2005(C++)のフォームアプリケーションでプログラミング と有りますが、ExpressEditionの事でしょうか?(簡単な話、マイクロソフトのHPからダウンロードして来たモノ) もしそうであるならば、別途PlatformSDKをダウンロードしてインストールしないと、LoadImageの様なAPIは使用出来ません。 コレです。設定等は、検索すれば出て来ます。 http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&displaylang=en で、肝心な呼び出し方ですが・・・。 「LoadImage()API」 http://msdn.microsoft.com/ja-jp/library/cc364835.aspx 例えば、ファイルから読んで、任意のサイズに伸縮させたい場合は、 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^ 見たいな単語が出て来ているかどうかです。出てきているのならば、必要と言う事です。
お礼
こんにちわ、回答ありがとうございます。 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); ということでよろしいのでしょうか?
お礼
両方ともできました^^ プログラムだけで画像を作る方法について長い間考えていたので、すごく助かりました。 本当にありがとうございます。