ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4025739 label画像の縮小と再表示
質問者:mudai_yeh windowsXP Microsoft Visual C++ .NET 2003アカデミック で作成しています。
画像ファイルをラベルへドロップするとその画像がラベルに表示されるようなものを作りたいと思っています。
ドロップする前もそのラベルには画像が表示されています。
画像を表示させるところまでは成功したのですが、画像のサイズを元のラベルにあわさせるのが知識が足りず苦戦しています。
private: System::Void label1_DragDrop(System::Object * sender, System::Windows::Forms::DragEventArgs * e)
{
     CDC* hdc;
     //ドロップしたファイル名の取得
     String *files[] = dynamic_cast<String*[]>(e->Data->GetData(DataFormats::FileDrop));
     String *path = files[0];
     Debug::WriteLine("ドロップ");
     Debug::WriteLine(path);
     Image *image1 = Image::FromFile(path);
     label1->Text = S"リビング";
     label1->Size = System::Drawing::Size(96, 72);
     label1->Image = image1;
     CDC::StretchBlt(24,24,96,72,hdc,24,24,96,72,SRCCOPY);
}

間違っているところはおそらくStretchBltの位置や引数のミスなどなのでしょうがどう書き換えたらいいのか良くわかりません。
回答のほどよろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/16 04:53
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.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つの引数は描画もとの範囲になります
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/20 10:00
この回答へのお礼詳しくおしえてもらってありがとうございます!!
やっと理解ができました。
ほんと理解がおそくて・・

ありがとうございます!!

回答

ANo.3 g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, g );
の最後の引数が違いますよ
ここは 引数の扱う数字がどの単位なのかを指定します

g->DrawImage( img2, rc, 0, 0, image1->Width, image1->Height, GraphicsUnits::Pixel );
といった具合に修正してください
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/18 09:05
この回答への補足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;
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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と指定してやらないといけないようです
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/16 16:51
この回答への補足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[]' に変換できません。
です。エラーを見ると引数が違うのかな?と思いますけど。。何が間違ってるかさっぱりです。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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のクラスなので マネージドアプリではほとんど使いませんよ
回答者:redfox63
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/16 06:59
この回答への補足すいません・・勉強不足で試行錯誤しているところですが。。
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;
各関数でも引数が違うものがありこんがらがってます。よろしくお願いします。
この回答へのお礼この回答にお礼をつける(質問者のみ)