質問 |
||
| 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; 各関数でも引数が違うものがありこんがらがってます。よろしくお願いします。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |