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

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

label画像の縮小と再表示

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の位置や引数のミスなどなのでしょうがどう書き換えたらいいのか良くわかりません。 回答のほどよろしくお願いします。

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

  • ベストアンサー
  • 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

  • 画像のラベリング

    画像処理について勉強しています。 画像のラベリングを行うプログラムを書いていたのですが、意図した結果になりません。 以下の関数で実現しようとしましたが、上手くいきませんでした。何か、決定的に間違っている点などがありましたら、教えてください。 また、参考になるWebページなどがありましたら、教えていただけると幸いです。 image2[][]には、レナ画像の512x512を判別分析法を使用して2値化した画像データが格納されています。 また、label[]は全て-1で初期化しました。(initialize()) void labeling(){ int x,y; int up_label,left_label; int label_num=1; //初期ラベル int label_add=1; //ラベルの増分 int max; int i; initialize(); for(y=0; y<y_size1; y++){ for(x=0; x<x_size1; x++){ if(image2[y][x]==0 && label[y][x]==-1){ up_label=left_label=500; if(y-1>=0) up_label=label[y-1][x]; if(x-1>=0) left_label=label[y][x-1]; if(up_label==500 && left_label==500){//(0,0)の地点の処理 label[y][x]=label_num; }else if(up_label==left_label){//上と左が等しい場合の処理 //上と左のラベルが無い場合はラベルを作る if(up_label < 0) label_num += label_add; //ラベルを付与 label[y][x]=label_num; }else{//それ以外の処理 //上と左で小さいほうのラベルを付与する if(up_label<0) label[y][x]=left_label; else if(left_label<0) label[y][x]=up_label; else label[y][x]= (up_label < left_label)? up_label:left_label; } } } } }

  • 特定の<input >タグ及び<label>タグの部分をCSSで非表示にしたい。

    下記コードの<input >タグ及び<label>タグの部分をCSSで非表示にしたいのですが、 <div class="image-size-item"> <input id="image-size-thumbnail-142" type="radio" value="thumbnail" name="attachments[142][image-size]"/> <label for="image-size-thumbnail-142">サムネイル</label> <label class="help" for="image-size-thumbnail-142">(96 × 96)</label> </div> 問題はimage-size-thumbnail-142の最後の番号及び桁数が出力ごとに変化します(例:image-size-thumbnail-154、image-size-thumbnail-2223等)。このような場合、CSSはどのように記述すればよいのでしょうか? CSSは、システムの関係上、同ページのヘッダー内に記述する必要があり、タグ内に直接記述することはできません。 以下のようなCSSコードを<head>内に記述しましたが、 <style type="text/css"> [id~="image-size-thumbnail"] { display: none; } [for~="image-size-thumbnail"] { display: none; } </style> 上記コードの<input >タグ及び<label>タグの部分を非表示にすることができません。どこが間違っているかご指摘いただけると幸いです。また、もっと良い方法があれば、教えてください。 なお、同ページには他の部分において<input >タグ及び<label>タグが使用されている箇所が複数ありますので、<input >タグ及び<label>タグ部分を全て表示にするというCSSの記述は使用できません。 参考サイト等ありましたら、教えて下さい。 よろしくお願いします。

  • Label を リスナーと結びつける方法

    フレーム上に (ボタンやリストやチェックボックスではなくて) ラベルを用いて、ラベルを押すことにより 背景が変わるプログラムを作りたいのですが どのようにイベント処理すれば、うまくいくのでしょうか。 プログラムは以下のように作りましたがイベントリスナを どのように加えればいいのかがわかりません>< よろしくお願いしますm(_ _)m import java.awt.*; import java.awt.event.*; public class Test{ public static void main(String args[]){ MyFrame f=new MyFrame("Test"); f.setVisible(true); } } class MyFrame extends Frame{ Label red, green, blue; MyFrame(String s){ super(s); setSize(200,200); setLocation(100,150); setLayout(new FlowLayout(FlowLayout.CENTER)); add(red=new Label("■")); red.setForeground(Color.red); add(green=new Label("■")); green.setForeground(Color.green); add(blue=new Label("■")); blue.setForeground(Color.blue); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } }

    • ベストアンサー
    • Java
  • 画像読み込み時のOutOfMemory

    VC++2010ExpressのWindows Applicationで画像のサムネールを作るプログラムを作っています。 概略、つぎの様なコーディングです(細部は気にしないで下さい)。 for filePath in dlg->Files{ try{ String^ FileName = Path::GetFileName(filePath); Image^ img = Image::FromFiles(filePath); Bitmap^ bmp = gcnew Bitmap(Image, 48, 48); bmp->Save(FolderPath + "\\Thumbnails\\" + FileName); } chactch(System::Exception^ err){ Debug::Print("{0}", err->Massages); } } 問題は、数万件の画像を処理したときに、数千件までは順調に処理が進むのに、そのあと「OutofMemory」とか「メモリー不足」とか「GDI+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。

  • Visual C++のStretchBltについて

    こんにちは VC++で壁紙チェンジャーのプログラムを作成していたのですが、壁紙画像をStretchBltをつかってプログラムの中に表示させたいのですが、pDCをつかって呼び出すさいpDC->StretchBlt();の括弧ないは何を記述すればよいのですか?わかるかたいたらご指導ください。参考までに前後の文 OnPaint 省略 else { CRect ClientRect; GetClientRect(ClientRect); BITMAP BMP; HBITMAP h_BMP=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,_T(m_filename), IMAGE_BITMAP,0,0,LR_LOADFROMFILE); CDC* pDC=this->GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); HBITMAP h_OLD_BMP=(HBITMAP)::SelectObject(MemDC.m_hDC,h_BMP); ::GetObject(h_BMP,sizeof(BITMAP),&BMP); //////////////////////////////        ここ→pDC->StretchBlt(); ////////////////////////////// ::SelectObject(MemDC.m_hDC,h_OLD_BMP); MemDC.DeleteDC();

  • C++ ファイル列挙について

    以下のコードで指定のファイルを検索し、フルパスで配列に格納しています。 このとき、ファイル名のみ(パスと拡張子無し)で格納する方法はありますでしょうか。 どうかよろしくお願いします。 // enum_files.cpp // compile with: /clr using namespace System; using namespace System::IO; int main() { String^ folder = "C:\\"; array<String^>^ dir = Directory::GetDirectories( folder ); Console::WriteLine("--== Directories inside '{0}' ==--", folder); for (int i=0; i<dir->Length; i++) Console::WriteLine(dir[i]); array<String^>^ file = Directory::GetFiles( folder ); Console::WriteLine("--== Files inside '{0}' ==--", folder); for (int i=0; i<file->Length; i++) Console::WriteLine(file[i]); return 0; }

  • PHP GD 画像が縮小できない

    宜しくお願いします。 ※ローカル環境です。 (WinXP PHP5 Smarty PEAR MySQL ※GDはインストされています。) 下記のコードで、サーバーにもともと上げてある画像(jpeg)を縮小して、 それをブラウザに表示させようと思います。 ですが、縮小されずに、元の画像サイズのまま表示されてしまいます。 おかしな点をご指摘下さいませ。 また、(1)で、 jpegファイルを取り込むコードがありますが、これは、 もし画像がGIFであったりPNGの場合を顧慮するなら、 取り込む際にそれぞれを判定するのが基本でしょうか? もし、今回のようにサバー元の画像をリサイズするのであれば、拡張子もわかっていますので、 jpegファイルだけのことを考えればいいですが、 たとえば、任意のアップロードされたファイルを扱う場合は、上記3種類を判定すして処理すべきですよね? 以上、2点を回答下さいませ。 // -- (1) // 画像を読み込む。 $file_path = "http://www元画像.com/img/aa.jpg"; $image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む /*********** $image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む $image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む ************/ // -- (2) // 画像のサイズを取得。 $width = ImageSX($image); //横幅(ピクセル) $height = ImageSY($image); //縦幅(ピクセル) // -- (3) // 縮小した画像のサイズを決める。 $new_width = 100; $rate = $new_width/$width; //圧縮比 $new_height = $rate*$height; // -- (4) // 空の画像を作成する。 $new_image = ImageCreateTrueColor($new_width, $new_height); // -- (5) // サンプリングしなおす  ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height); // -- (6) // ブラウザに出力する場合。 ImageJPEG($image); //ImageJPEG($image,'simpletext.jpg'); //ImageGIF($image); //環境によっては使えない //ImagePNG($image); // -- (7) // メモリを解放する。 imagedestroy ($new_image); imagedestroy ($image);

    • ベストアンサー
    • PHP
  • android Javaの画像表示について

    ImageView image1 = new ImageView(this); image1.setScaleType(ImageView.ScaleType.CENTER); image1.setImageDrawable(getResources().getDrawable(R.drawable.gazou)); setContentView(image1); で画像を表示させたりしているのですが画像パスにString型の引数を使う方法が知りたいです。 また scaletypeだと他のレイアウトが消えたりするので他にいい方法はないのですか?

    • ベストアンサー
    • Java
  • マルチモニタのデスクトップイメージを取るには?

    VisualC++です。 デスクトップイメージを取得するため、 CMainFrm内で、 CRect rect; CWnd* pwWnd = GetDesktopWindow(); pwWnd->GetClientRect( &rect ); CDC* pwDC = pwWnd->GetDC(); とやって、このpwDCを使ってイメージを取得することに成功しました。 しかし、この方法では、シングルモニタの場合のみ成功し、マルチモニタでは、メインモニタのイメージのみが取れて、双方の画面のイメージはとれないようです。 わたしは今、モニタを2つ用意して、右側がメインモニタ、左側がサブモニタとしていますが、左側のモニタのイメージを取得するには、どうしたらよいでしょうか。 rectにも、メインモニタのサイズが入っています。 HDC hDC = ::CreateDC("DISPLAY", NULL, NULL, NULL); CDC* pwHDC = CDC::FromHandle( hDC ); とやって、このpwHDCを使っても、メインモニタのみのデスクトップイメージしかとれないようです。

  • Active Basic 画像表示 添削願い

    AB4.23.00を使っています。 複数画像を表示しようと頑張っているのですが、どうやっても出来ません。 すみませんが、コードの添削の方をお願いします。 '----------------------------------------------------------------------------- ' イベント プロシージャ '----------------------------------------------------------------------------- ' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。 ' ウィンドウ ハンドル: hMainWnd ' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。 /*全体*/ Dim hMemDC As HDC /*背景*/ Dim hBackDC As HDC Dim hBackBmp As HBITMAP /*自機*/ Dim hMyDC As HDC Dim hMyBmp As HBITMAP /*プログラムの設定など*/ Dim Dir As String '----------------------------------------------------------------------------- ' ウィンドウメッセージを処理するためのコールバック関数 Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord ' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。 ' イベントプロシージャの呼び出しを行います。 MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam) End Function '----------------------------------------------------------------------------- ' ここから下は、イベントプロシージャを記述するための領域になります。 Sub MainWnd_Destroy() stg_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) Dim hDC As HDC Dim OldBmp As HBITMAP SetWindowText(hMainWnd,"しゅーてぃんぐ") 'ディレクトリ取得 Dim path[MAX_PATH+1] As Byte GetCurrentDirectory(MAX_PATH,path) Dir=path 'MainWndのDC取得 hDC=GetDC(hMainWnd) '全体DCメモリ作成 hMemDC=CreateCompatibleDC(hDC) '背景 hBackBmp=LoadImage(0,back.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hBackDC=CreateCompatibleDC(hDC) 'キャラクター hMyBmp=LoadImage(0,A.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE) hMyDC=CreateCompatibleDC(hBackDC) '描写 SelectObject(hMemDC,hBackBmp) BitBlt(hMemDC,0,0,640,480,hBackDC,0,0,SRCCOPY) SelectObject(hMemDC,hMyBmp) BitBlt(hMemDC,0,0,40,50,hMyDC,0,0,SRCCOPY) ReleaseDC(hMainWnd,hDC) End Sub Sub MainWnd_Paint(hDC As HDC) BitBlt(hDC,0,0,640,480,hMemDC,0,0,SRCCOPY) End Sub back.bmpの上にA.bmpを描写したいです。 透過処理などはいらないので、どうすれば表示することが出来るかを教えてください。 今は、どちらか片一方しか表示されません。 また、 http://www.geocities.jp/debu0510/basic/main17.html を参考にさせていただいたのですが、CreateCompatibleBitmap関数の使い方が分かりません。 これは、どのようにして使用するのでしょうか。 こちらもご教授お願いします。

専門家に質問してみよう