• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:label画像の縮小と再表示)

WindowsXPで画像の縮小と再表示を行う方法

このQ&Aのポイント
  • WindowsXP Microsoft Visual C++ .NET 2003アカデミックで作成している場合、画像ファイルをラベルにドロップすると、その画像が表示されるようにしたいと思っています。
  • 現在、画像の表示までは成功していますが、画像のサイズを元のラベルに合わせる方法について知識が不足しているため、苦戦しています。
  • おそらく、StretchBltの位置や引数の設定に誤りがあるのかもしれませんが、正しい書き換え方がわかりません。ご教示いただければ幸いです。

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

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

Graphicsオブジェクトの構築をImage1から行っていますが これではスケーリングされないと思います Graphicsオブジェクトをラベルの大きさのイメージオブジェクトから作成しましょう Image* img2 = new Bitmap( sz.Width, sz.Height); Graphics* g = Graphics::CreateFromImage( img2 ); Image img1 = Image::FromFile( path ); g->DrawImage( img1, rc, 0, 0, sz->Width, sz->Height, GraphicsUnit::Pixel); g->Dispose(); といった具合です DrawImageは24番目のオーバーロードを使います rcは最終的な描画領域 rcに続く4つの引数は描画もとの範囲になります

mudai_yeh
質問者

お礼

詳しくおしえてもらってありがとうございます!! やっと理解ができました。 ほんと理解がおそくて・・ ありがとうございます!!

その他の回答 (3)

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

g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, g ); の最後の引数が違いますよ ここは 引数の扱う数字がどの単位なのかを指定します g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, GraphicsUnits::Pixel ); といった具合に修正してください

mudai_yeh
質問者

補足

GraphicsUnits::PixelがGraphicsUnit::Pixelでした。 コンパイルは通りましたが・・・画像がサイズに合わせて、縮小または拡大されて表示されてくれません・・ いろいろ試行錯誤しての現状です。 結局は縮小されず、真ん中だけが表示されています。。 //ドロップしたファイル名の取得 String *files[] = dynamic_cast<String*[]>(e->Data->GetData(DataFormats::FileDrop)); String *path = files[0]; Debug::WriteLine("ドロップ"); Debug::WriteLine(path); //Image *image1 = Image::FromFile(path); System::Drawing::Size sz = label1->Size; System::Drawing::Rectangle rc = System::Drawing::Rectangle( 0, 0, sz.Width, sz.Height ); Image* image1 = new Bitmap(path); Graphics* g = Graphics::FromImage( image1 ); g->DrawImage( image1, rc, 0, 0, 92, 76, GraphicsUnit::Pixel ); g->Dispose(); label1->Image = image1; //label1->Text = S"リビング"; //label1->TextAlign = System::Drawing::ContentAlignment::MiddleCenter; //label1->Image = image1;

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

イクリュードでおかしなヘッダーを付け加えていませんか? using指定は  using namespace System;  using namespace System::ComponentModel;  using namespace System::Collections;  using namespace System::Windows::Forms;  using namespace System::Data;  using namespace System::Drawing; です Rectangleはそのままで通りますが Sizeが System::Drawing::Sizeと指定してやらないといけないようです

mudai_yeh
質問者

補足

using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Diagnostics; と私のでは記述してありました。 //ドロップしたファイル名の取得 String *files[] = dynamic_cast<String*[]>(e->Data->GetData(DataFormats::FileDrop)); String *path = files[0]; Debug::WriteLine("ドロップ"); Debug::WriteLine(path); Image *image1 = Image::FromFile(path); System::Drawing::Size sz = label1->Size; System::Drawing::Rectangle rc = System::Drawing::Rectangle( 0, 0, sz.Width, sz.Height ); Image* img2 = new Bitmap( sz.Width, sz.Height ); Graphics* g = Graphics::FromImage( img2 ); g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, g ); g->Dispose(); label1->Image = img2; //label1->Text = S"リビング"; //label1->TextAlign = System::Drawing::ContentAlignment::MiddleCenter; //label1->Image = image1; がソースです。 エラーは error C2664: 'void System::Drawing::Graphics::DrawImage(System::Drawing::Image __gc *,System::Drawing::PointF __gc[],System::Drawing::RectangleF,System::Drawing::GraphicsUnit,System::Drawing::Imaging::ImageAttributes __gc *,System::Drawing::Graphics::DrawImageAbort __gc *,int)' : 7 番目の引数を 'System::Drawing::Graphics __gc *' から 'System::Drawing::PointF __gc[]' に変換できません。 です。エラーを見ると引数が違うのかな?と思いますけど。。何が間違ってるかさっぱりです。

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

単純に 元のLabelのスケーリングでいいなら表示用のイメージを作成してこれを LabelのImageに設定しましょう Size sz = label1->Size; Rectangle rc = Rectangle( 0, 0, sz.Width, sz.Height ); Image* img2 = new Bitmap( sz.Width, sz.Height ); Graphics* g = Graphics::FromImage( img2 ); g->DrawImage( img, rc, 0, 0, image1->Width, image1->Height, GraphicsUnits::Pixel ); g->Dispose(); label1->Image = img2; といった具合でやります CDCなどはMFCのクラスなので マネージドアプリではほとんど使いませんよ

mudai_yeh
質問者

補足

すいません・・勉強不足で試行錯誤しているところですが。。 Rectangle rcがその前に;をつけろとエラーが出てしまいます。 もっと具体的に教えていただけないでしょうか? 自分で改変してみたのが以下です。 System::Drawing::Size sz = label1->Size; System::Drawing::Rectangle rc = System::Drawing::Rectangle( 0, 0, sz.Width, sz.Height ); Image* img2 = new Bitmap( sz.Width, sz.Height ); Graphics* g = Graphics::FromImage( img2 ); g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, g ); g->Dispose(); label1->Image = img2; 各関数でも引数が違うものがありこんがらがってます。よろしくお願いします。

関連するQ&A