• 締切済み

BMP画像の拡大について

現在BMPファイルを読み込んで表示させるプログラムを作成しています。 このプログラムに拡大表示機能を追加しようとして、試しにStretchBltで倍の大きさに拡大しようとしたらエラー(おそらくメモリ不足?)となってしまいました。 このような機能を作成する場合に何か良い方法があったら教えていただけないでしょうか。 またMSDNを見て思ったのですがStretchBltとStretchDIBitsは同じようなことを行なう関数のように思えるのですがどちらを使用すべきなのでしょうか。 初歩的な質問かもしれませんがご教授願います。 開発環境:WindowsXP Pro / VC++ 6.0

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

該当部分のソースを公開したほうが、話が早いような気がしますが、SelectObjectを元に戻すのを忘れてるとか。

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

とりあえず、GetLastErrorで本当にメモリ不足なのかどうか確認しましょう。

MOYAJI
質問者

お礼

回答ありがとうございます GetLastErrorで確認してみましたがやはりメモリが足りないようでした。

MOYAJI
質問者

補足

いろいろ試して分かったのですが単にBMPを読み込んで拡大する分には10倍だろうと20倍だろうとできるのですが、最初にStretchBltでBMPを表示し、同じサイズのBMPを作成(CreateCompatibleDC,CreateCompatibleBitmap)して最初に表示したBMPの上にStretchBlt(SRCAND指定)で重ねようとすると2倍とかもエラーになっていました。 メモリは前者のほうが多く使用すると思うのですがなぜ後者のほうがエラーとなってしまうのかがわかりません。 もし思い当たることがありましたらご教授願えないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

 こんにちは。  StretchDIBitsの方は、ビットマップハンドルを作成していない状態から、描画出来ます。  要はファイルから丸ごと吸い上げたバッファを、sizeof(BITMAPFILEHEADER)の分だけずらして其のまま渡す様な感じで使用出来ます。  StretchBltはビットマップハンドルを作成している時に描画出来ます。此方の方がより多く使われているように思えます。

MOYAJI
質問者

お礼

回答ありがとうございます。 何か処理の仕方も違うのかなと思っていたのですがハンドルの有無とかの違いだけなんですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • wathavy
  • ベストアンサー率22% (505/2263)
回答No.1

メモリ不足かどうかの確認のため、1.1倍くらいの拡大率で試験してみてはいかがでしょうか? それでも駄目なら、コーディングの問題ですよね。

MOYAJI
質問者

お礼

回答ありがとうございます。 質問時に書き忘れていましたが1.5倍位までは拡大できていました。 なので処理自体は問題ないと思っています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++プログラムをつかったBMP画像の拡大縮小について

    現在VC++をつかった画像を扱うプログラミングを学習中なのですが、画像データの取り扱いについてわからないことがあるため教えていただきたいです。 BMP画像をバッファに取り込んだあとで、画像の縦横を拡大縮小したデータを新たなバッファに格納したいのですが、画像を拡大縮小する方法がわかりません。いくつかのプログラムのソースを見させていただいたのですが、BITMAPINFOHEADER構造体の中のbiWidthやbiHeightの値を変えているだけのようなのです。 これらの値を変えるだけで、指定した幅と高さに変換された画像データが得られるのでしょうか? また、それで拡大縮小されるならば、変換された画像データは輝度情報が滑らかになるように何かしらの補正が加えられていたりするのでしょうか?それとも、途中途中の輝度を単純に抜いていたりするだけなのでしょうか。 その辺の原理についても教えていただけるとうれしいです。 お手数をかけますが、よろしくお願いします。

  • BMP画像を画像処理して連続に表示したいですが?

    プログラミングの初心者ですが、現在VC++2005のフォームアプリケーションでプログラムについて勉強しています。画像を連続表示するところで、わからなくなってしまったので、みなさんのご指導お願いいたします。 やりたい処理は、取り込んだ画像の色を変化させて、順番に表示したい 処理です。作成したプログラムは下記のようになります。 前略 for(n=0; n<256; n+=20){ for(y=0; y<480; y++){ for(x=0; y<640; x++){ bmp->Setpixel(x, y, Color::FromArgb(n, n, n)); } } pictureBox->Image = bmp; Thread::Sleep(2000); } nの値をbmpに入れてから一回表示し、さらにnを足してからbmpに入れて表示するといった流れですが、Sleepを入れても何にも表示されません。 どういったところは不具合なのかをよくわかりません。 ご指導をいただければ感謝致します。どうぞよろしくお願い致します。

  • 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();

  • RGB値を画像(PNG・BMPJPEGなど)に出力したい

    配列に格納したRGB値からPNG画像(またはBMP画像JPEG画像)を作成したいと思っているのですが、画像ファイルの作り方がわかりません。 ファイルを作成⇒ヘッダ書きこみ⇒色情報書き込み と、漠然とした手順しかわかりません。 詳しい方法、または参考URLがわかる方、アドバイスお願いします。 以下補足です。 ・開発環境はwindowsXPのVC7でC言語を使っています。 ・openCVで適切な関数があれば助かります。 (openCVのIplImageの読み込みなども参考にしようと思いましたがxmlファイルからの取得とは違うのでわかりませんでした。)

  • mfcの画像表示で、bmp表示がよくわかりません

    mfcの画像表示で、bmp表示がよくわかりません。 特に、SelectObject()でBitmapを戻す等が特によくわかりません。 今までは、そういうもんだとしてきたのですが、放っておけない事態になりまして、 相談させて下さい。 (1)下記のbmpDC.SelectObject(oldbmp)等について、その仕組みを詳細に紹介しているHPを ご存じでしたらお教えください。 (2)下記プログラムの画像の扱いで、まずい部分を、おかしいなと思われた部分をお教えください。  動作は、問題なく動作しています。BITMAPを敷き詰めるプログラムです。 CArray<HBITMAP> hBitAry; (HBITMAPを配列にしているまずさは今回は除外して下さい。) … int topX=-100-5; int topY=0; int hLen=100; int wLen=100; int yoko=0; CDC *pDC=mPict.GetDC(); for(int i=0; i<hBitAry.GetCount(); i++) { CDC bmpDC; bmpDC.CreateCompatibleDC(pDC); CBitmap *pBitmap=CBitmap::FromHandle(hBitAry.GetAt(i)); BITMAP BMP; pBitmap->GetBitmap(&BMP); CBitmap *oldbmp=bmpDC.SelectObject(pBitmap); if(yoko<3) { topX+=100+5; yoko++; } else { topX=0; topY+=100+5; yoko=0; } pDC->SetStretchBltMode(COLORONCOLOR); pDC->StretchBlt(topX,topY,100,100,&bmpDC,0,0,BMP.bmWidth,BMP.bmHeight,SRCCOPY); bmpDC.SelectObject(oldbmp); ::DeleteObject(CBitmap::FromHandle(hBitAry.GetAt(i))); } ReleaseDC(pDC); どうぞよろしくお願い致します。

  • VC++でEUC->ShiftJIS変換

    現在、VC++はじめて1週間です。MSDNがない為HELPが参照出来ません。 VC++にてプログラムを作成しているのですが、EUC→ShiftJIS変換を行いたいのですが、関数は用意されているのでしょうか。 また、用意されていない場合、フリーのライブラリ等ご存知の方がいらっしゃいましたら、教えて頂けないでしょうか。 よろしくお願いします。

  • ビットマップ画像表示

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト/////////////////////////////////  IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp" ///ヘッダースクリプト/////////////////////////////////  #define IDB_BITMAP1   3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){   HDC hmdc;   HBITMAP hBitmap;   BITMAP bmp;   HINSTANCE hInst;   int BMP_W, BMP_H;   hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);   hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得   GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る   BMP_W = (int)bmp.bmWidth;  //画像の幅   BMP_H = (int)bmp.bmHeight;  //画像の高さ   hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得   SelectObject(hmdc, hBitmap);   BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);   StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);   DeleteDC(hmdc); //デバイスコンテキストハンドルを開放   DeleteObject(hBitmap);   return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

  • アイコンが微妙に拡大されました

    VALUE STARのVL370/7を使っています。 先日、パソコンの中に入っている要らないプログラムを削除しました。 そのときに、Liquid View(だったと思います)という、 画面表示を拡大して見られるというソフトを削除しました。 すると、スタートボタンの幅が1.2倍くらいに拡がり、 アイコンを見ると、少しギザギザと無理やり拡大されたような 表示になってしまいました。 さらに、インターネットしている時、「お気に入り」を押した時に 表示される数々のサイトの横のアイコンや、 スタートボタンから「すべてのプログラム」を押した時に表示される プログラムのアイコンも少しずつ拡大されていて、 ちょっと見にくいです。 直し方をご存じの方いらっしゃいましたら、教えてください。

  • C++の画像処理について【画像のピクセル値を表示する方法】

    画像処理に関する質問です。初歩的なことかもしれませんが、ご教授お願いいたします。 開発環境はVisual C++ 2005です。 JPEGまたはBMP画像を読み込んで、その画像のピクセル値を表示するプログラムを作成したいのですが、まったくどうしてよいか判らず、行き詰っています。 これまでいろいろ試してみたのですが、読み込んだ画像をBit値に変換してしまったり(そのせいでパソコンがクラッシュしてしまいました…)、うまくいきません。 画像処理の対象となる原画像を取り込み、その原画像のピクセルの色情報を表示するためには、どのような処理を行えばよいのでしょうか? どうぞよろしくお願いします。

  • vc++にて、画像の色の情報表示プロパティをおしえてください。

    vc++のマネージ形式で,bmpやjpgの画像からこの画像は、4byte、あの画像は24byteとの色情報が使われてるとか色情報をbuttonを押してlabelに表示したいのですがどのプロパティを使えばいいかわかりません。MSDNでも探しましたけどわかりませんでした。初心者なので適切に教えてくれたらうれしいです。