- ベストアンサー
WindowsXPで画像の縮小と再表示を行う方法
- WindowsXP Microsoft Visual C++ .NET 2003アカデミックで作成している場合、画像ファイルをラベルにドロップすると、その画像が表示されるようにしたいと思っています。
- 現在、画像の表示までは成功していますが、画像のサイズを元のラベルに合わせる方法について知識が不足しているため、苦戦しています。
- おそらく、StretchBltの位置や引数の設定に誤りがあるのかもしれませんが、正しい書き換え方がわかりません。ご教示いただければ幸いです。
- みんなの回答 (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つの引数は描画もとの範囲になります
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, g ); の最後の引数が違いますよ ここは 引数の扱う数字がどの単位なのかを指定します g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, GraphicsUnits::Pixel ); といった具合に修正してください
補足
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)
イクリュードでおかしなヘッダーを付け加えていませんか? 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と指定してやらないといけないようです
補足
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)
単純に 元の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のクラスなので マネージドアプリではほとんど使いませんよ
補足
すいません・・勉強不足で試行錯誤しているところですが。。 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; 各関数でも引数が違うものがありこんがらがってます。よろしくお願いします。
お礼
詳しくおしえてもらってありがとうございます!! やっと理解ができました。 ほんと理解がおそくて・・ ありがとうございます!!