• ベストアンサー

LoadImage関数について(VC++)

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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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; といった具合でしょう ・・・

judas15
質問者

お礼

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

その他の回答 (4)

回答No.4

 既に正しい回答が出されていますので、其方に沿った方が無難だと思います。  一応、訊ねられた事に返答だけさせて頂きます。 >>・コマンド ライン オプション '/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を参考にして見て下さい。

judas15
質問者

お礼

せっかく長々と詳しく教えていただいたのにすみません、今回は別の方法でできてしまいました。 クリーンすることでエラーもなくなりました^^ こちらの方法も使う機会があると思うので、そのときにまた使ってみようと思います。 詳しい説明ありがとうございました。

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

適切な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オブジェクトには成りえないのでそのままでは使い物になりません

judas15
質問者

お礼

回答ありがとうございます。 こちらの方法から先にやらせていただきました^^; 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)
回答No.2

C++/CLIでやるなら Bitmapオブジェクトを使ったほうが簡単でしょう pictureBox1->Image = Bitmap::FromFile("ファイルパス"); といった具合です ・・・

judas15
質問者

お礼

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

回答No.1

 こんばんは。  ああ、それ、私が過去にした回答です(はっはっは)。  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^  見たいな単語が出て来ているかどうかです。出てきているのならば、必要と言う事です。

judas15
質問者

お礼

こんにちわ、回答ありがとうございます。 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); ということでよろしいのでしょうか?

関連するQ&A

  • VC++2008EE 2種のコンソールの違い

    VisualC++入門書で学習中の者です。(VisualC++2008EE使用) Win32コンソールとCLRコンソールの2種類があり、本ではWin32コンソールのみ使用して解説してます。 構成プロパティ/全般/プロジェクトの規定値では、共通言語ランタイムサポート(/clr)になっています。これでC++/CLIに対応するいうことです。 では、この場合のWin32コンソールとCLRコンソールとで違いって何でしょうか。 標準C++の記述とC++/CLIの記述が混在したときにコンパイルでエラーになる場合があるとか、実行速度に違いが出るとかの差が生じるものでしょうか。 よろしくお願いします。

  • 関数の形

    座標が与えられ小問に応えるという設定です。問題文では座標が指定されているのですが、この座標からどういう形の関数かを推定できますか。x座標が2次式でy座標が1次式で与えられているので、y=x^1/2(yはxの2分の1乗、つまり√の関数になっているのかなと思うのですがどうでしょうか。

  • 関数

    関数 y=x2と、関数 y= -3/x (x>0) のグラフがあります。 関数 y=x2のグラフ上の点Aのx座標は1です。また、関数 y= -3/x のグラフ上の点Bのx座標は6です。 次の問いに答えなさい。 (1)点B のy座標を求めなさい。 (2)2点 A,Bを通る直線の方程式を求めなさい。 (3)関数 y=x2において、x座標が-2.65から2.35まで増加するときの、変化の割合を求めなさい。 (4)関数 y=x2のグラフ上の点で、x 座標が-2.65の点をCとし、x座標が2.35の点をDとします。     線分BCと線分ADとの交点をEとするとき、AE:ED の比を求めなさい。 (1)(2)(3)は分かりました。(4)の求め方がわかりません。教えて下さい。

  • 関数

    関数Y=x2(二乗) と Y=-3/x(x >0)のグラフがあります。 関数 Y=x2(二乗)のグラフ上の点Aのx座標は1です、また関数 Y=-3/x のグラフ上の点Bのx座標は6です。次の問いに答えなさい。 (1) 点Bのy 座標を求めなさい。 (2) 2点A、Bを通る直線の方程式を求めなさい。 (3) 関数 Y=x2 において、xの値が-2.65から2.35まで増加するときの変化の割合を求めなさい。 (4) 関数 Y=x2 のグラフ上の点で、x座標が-2.65の点をCとし、x座標が2.35の点をDとします。    線分BCと線分ADとの交点をEとするとき、AE:EDの比を求めなさい。 という問題です。 (1)はY=-1/2 (2)はY=-3/10x+13/10 (3)は-0.3 となったのですが、合ってますか? また(4)は求め方がわかりません。教えてください。

  • 関数

    2次関数のグラフとx軸の共通点のx座標を求めなさい。 (1)y=xの二乗ー2x-3 0=(x+1)(x-3)になるのは分かりますね。 0=(x+1)(x-3) からx=-1、3になって符号が逆になる過程がワカリマセン。教えて下さい。

  • 二次関数

    A.次の二次関数をy=a(x-p)^2+qの形(標準形)に変形し、頂点の座標とy軸との交点の座標を求めてください。 (1)y=x^2-6x+11 (2)y=x^2+2x-4 (3)y=2x^2+8x+5 (4)y=-x^2+2x+1 B.次の関数の最大値、最小値を求めてください。最大値、最小値がない場合は「なし」と書いてください。最大値、最小値をとるときのxの値も書いてください。 (1)y=x^2-6x+5 (2)y=-x^2-4x+2 C. (1)二次関数y=(x-2)^2-3の頂点の座標とy軸との交点の座標を求めてください。 (2)1≦x≦4における二次関数y=(x-2)^2-3の最大値、最小値を求めてください。 (1)端点のy座標の計算をしてください。 (x=1のとき) (x=4のとき) (2)最大値、最小値を求めてください。 (最大値)〇〇のとき 最大値 (最小値)〇〇のとき 最小値

  • 関数

    図のように.関数y=1/4x^2のグラフ上の.x座標が2である点をP. x座標が正でy座標が4である点をQとし.y軸上の点(0.4)をRとする. このとき.△PQRの面積を求めてください お願いします

  • 1次関数の問題で・・・

    1次関数の問題が分かりません。教えてください。 (1)1次関数y=-2x+3で、xがー2から3まで増加したときの変化の割合を求めなさい。 (2)yはxに反比例し、そのグラフ上に点(1/2、24)がある。このグラフ上の点のうち、x座標とy座標がともに整数であるものはいくつあるか。 という問題です。お願いします。

  • 一次関数の問題がわかりません><

     一次関数の問題がわかりません><。  問題は、以下の通りです。 Oは原点、PはY=X-6のグラフと関数Y=-3/1X+6(3分の1プラス6)のグラフとの交点である。また、AはY軸上の点、Bは関数Y=X-6のグラフ上の点、Cは関数Y=-3/1X+6(3分の1プラス6)のグラフ上の点で、四角形ABCDは長方形である。    点A、Dの座標がそれぞれ(0、6)、(12、10)のとき、次の問いに答えよ。  (1)点Pの座標を求めよ  (2)点Bの座標を求めよ (1)は、余裕でできたのですが、(2)が全然わかりません。等積移動や全体の面積から該当の図形を出してみたりしたのですが、出ません(泣)  因みに、(1)の解は、(9、3) (2)は、(3、-3)となります。  画像添付させていただくので見にくいかもしれませんが、回答よろしくお願いいたします。

  • 二次関数について

    二次関数についてなんですが、解き方を教えてください。 二次関数  y=3x^2+6x-3の頂点の座標及び 軸の式を求めよ。という問題です。

専門家に質問してみよう