• ベストアンサー

Bitmapを動かすときのちらつきを抑えたい

wogotaの回答

  • ベストアンサー
  • wogota
  • ベストアンサー率42% (66/154)
回答No.2

画面描画が頻繁に行われるので、ちらつくものと思われます。 このちらつきを抑えるには、描画命令単位で描画させるのではなく、 決められた時間ごとに描画を行うほうがいいかもしれません。 RAM上に画面表示用の領域を用意します。描画は、その領域に対してのみ 行います。これは、単にメモリコピーと同じです。 そして、決められた時間ごとにその領域を画面表示部分にコピーします。 原理としてはこのような感じです。 (サンプルとかは提供できませんが、難しいことではないと思います)

pythian
質問者

お礼

時間ごとに区切ってみました。ですが、遅くしてもやはりちらついてしまいました。結構ビットマップが大きいので・・・これ以上下げるとスムーズに動かなくなってしまうので、妥協することにします。ありがとうございました。

関連するQ&A

  • Bitmap画像の消去について

    やりたいこととして Bitmap画像を表示する前になにかしら背景が描画されています。 そしてボタンを押すとか何かしらイベントが起こったときにBitmap画像を描画します。 そしてまたボタンを押すと背景はそのままでそのBitmap画像だけを消去する ということがしたいです。 今、ピクチャーボックスを使ってBitmap画像を表示することはできます。 ただそのBitmap画像を消去することはできていません。 探しているとピクチャーボックスを白く塗りつぶして、背景を再描画するって方法はあるのですが、いろいろあってその方法は使いたくないです。 Bitmap画像だけを消去する方法はあるのでしょうか? OSはVistaで、VC++2003.netを使っています。 宜しくお願いします。

  • Open CV でBitmap描画の高速化

     現在Open CVとVC++2008のC++/CLIを用いてform上のpictureBoxにカメラ画像を表示するプログラムを作成しています。  プログラムは,http://imagingsolution.blog107.fc2.com/blog-entry-91.htmlのサイトの『IplImageのPictureBoxへの描画』の項を参考にさせていただきました。 カメラ画像の描画だけでしたら,問題なく動作しますが,その他の処理を行うと,全体の動作が遅くなってしまいます。 そこで,どうにかして全体の動作速度あげようと,調べているとBitmapの描画は遅いということはわかりました。 しかし,どのようにすればBitmap描画を高速化出来るのかがわかりません... お分かりになる方がいらっしゃいましたら,何卒ご教授お願い致します。

  • C#でBitmapの画像を比較

    C#でBitmapの画像を比較するときに、 bmp.GetPixel(W, H); でひとつひとつ比較していけば出来るのですが、 全く同じBitmapかどうかの比較をするのに、 Bitmap情報の数値化などで、 簡単な方法はあるのでしょうか? 画像比較速度を上げたいので。 よろしくお願い致します。

  • VC++でBitmapとText文字を表示させたいのですが、

    VC++でBitmapとText文字を表示させたいのですが、 Bitmap上に、Rectを作成しTextを表示させると、 OSや画面設定等により、配置が微妙に変わってしまいます・・・ そこで、 BitmapとTextを合成して、新たにBitmapを作成できれば、 Bitmapなので、画面設定等には影響しないかと思っておりますが、 新たなBitmapの作成は可能なのでしょうか? また、Bitmapを作成せずに、OS等に依存しない方法はありますでしょうか? 環境は、Microsoft Visual Studio 2008です。

  • リアルタイムで再描画

    こんにちは。 Delphiを初めて1ヶ月の初心者です。 どうか、Windowのリサイズについてご教授ください。 MDIで画像を表示するプログラムを作成しています。 子画面をマウスドラッグでサイズ変更をしているとき、 マウス移動の間、図形連続的に再描画(縦横比を一定)しようとしています。 FormPaint内でClientWidth とClientheightの設定をしてもうまくいきません。 いい方法がありましたらご教授願います。

  • MFCでのBITMAP作成について

    VC++2005MFCで開発しています。 カメラからの画像入力の部分を作成しているのですがchar配列からのカラーbitmapの作成の仕方が分かる方いませんでしょうか? 直接ファイルに書き込む方法ですとフォーマット通りに書き込めば良いとは思うのですが、画面表示をしたいのでCBitmap又はHBitmapで取得したいです。 調べていると、モノクロだとSepBitmapBitsでできそうです。 しかし、msdnを見るとカラーの場合はSetDIBitsを使用しろとあるのですが、SetDIBitsの項を見ると何か思っている用法と違いそうです。 また、VC++.NETですとDrawing::Bitmap(( width, height, stride, format, scan0);でフォーマットを指定して作成できそうなのですが、それに相応するようなものはないかと探しているのですが見つかりません。 すいませんがご教授お願いします。

  • ダイアログ・ベースにBitmap登録

    「工学社 Visual C++ .NET ゲーム制作教科書」 で学習している初心者です。 ダイアログ・ベースのプログラムで,背景に 画像を使用する例題があります。 そこで リソースの追加→Bitmap→インポート→ファイルの選択 として登録を行うのですが,うまくいきません。 エラーは発生していないのですが,リソースビュー に登録されていません。 また, リソースの追加→Bitmap→新規作成 とした場合は,リソースビューにうまく登録されています。 原因・解決方法が分かりましたら教えてください。 バージョンは,Visual C++ .NET 2003, MFCアプリケーションのダイアログベースで新規作成しています。 よろしくお願いします。

  • bitmap画像の保存がうまくいきません。

    VC++のMFC、ダイアログベースで画像処理のソフトを作っています。 処理した画像を保存したいのですが、「描画できませんでした」というメッセージのでるファイルになってしまい、うまく保存できません。 プログラムは以下のようになっていてピクチャーコントロールの変数をm_pict8にしています。また、画像は24ビットで240×320のものを保存します。 static LONG CalcScanLineByte(const LONG w, const WORD bpp) { return (((bpp * w) + 31) / 32) * 4; } //----------------------------------------------------------- void Cstart2Dlg::OnBnClickedButton10() //保存ボタン { CFileDialog myDLG(FALSE,"BMP","*.BMP",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate | CFile::modeWrite|CFile::typeBinary); //ピクチャボックスからビットマップを取り出す HBITMAP hBitmap = m_pict8.GetBitmap(); //無いので処理できない if(hBitmap == NULL)return; //ビットマップの情報を取る BITMAP bitmap = {0}; ::GetObject(hBitmap, sizeof(bitmap), &bitmap); //4バイト調整したスキャンラインのサイズ const int iScanLineByte = ::CalcScanLineByte(240, bitmap.bmBitsPixel); //const int iScanLineByte = ::CalcScanLineByte(bitmap.bmWidth, bitmap.bmBitsPixel); //ファイルヘッダとビットマップヘッダ BITMAPFILEHEADER bmfh = {sizeof(bmfh)}; BITMAPINFOHEADER bmif = {sizeof(bmif)}; //ビットマップである事を示す名称 bmfh.bfType = ('M' << 8) | 'B'; //イメージデータへのオフセットはファイルヘッダ+ビットマップヘッダ bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmif); //見ての通り bmif.biBitCount = 24; //24ビットの時はBI_RGBで固定 bmif.biCompression = BI_RGB; //常に1で固定 bmif.biPlanes = 1; //見ての通り bmif.biWidth = 240; bmif.biHeight= 320; //bmif.biWidth = bitmap.bmWidth; //bmif.biHeight= bitmap.bmHeight; //4バイト調整も含めた正確な合計バイトサイズが必要 bmif.biSizeImage = iScanLineByte * bmif.biHeight; //ファイルヘッダ→ビットマップヘッダの順番に書き出す fout.Write(&bmfh, sizeof(bmfh)); fout.Write(&bmif, sizeof(bmif)); //イメージデータをセーブする HDC hMemDC = ::CreateCompatibleDC(NULL); ::SelectObject(hMemDC, hBitmap); //yを縦幅-1から回転させないと上下逆転してしまう for(int y = bmif.biHeight - 1; y >= 0; --y) { //3バイトずつステップする for(int x = 0; x < iScanLineByte; x += 3) { const COLORREF cref = ::GetPixel(hMemDC, x / 3, y); //色素の位置関係をBGRにしないと赤と青の関係が逆転してしまう const BYTE arrBy[3] = {GetBValue(cref), GetGValue(cref), GetRValue(cref)}; //1ピクセル分(3バイト)書き出す fout.Write(arrBy, sizeof(arrBy)); } } ::DeleteDC(hMemDC); } どこか改善点などありましたら、よろしくお願いいたします。

  • メーターの針をクrクル回していたら壊れました

    メーターのランプを交換しようと分解していたのですが、その際メーターの針が邪魔でなかなか分解できずクルクル回したりしていたのですが、いざ組み直してみると速度メーターの針と燃料計の針が動かなくなっていました。これはもう壊れてしまったということでしょうか? バイクはスズキのヴェクスター150です。

  • VBは速度が遅い?

    VisualBasic6でプログラムを組んでいて疑問がわきました。 主に計算主体の場合、C言語と比べて速度が遅いと言われますが、どうしてVBで作ると同じアルゴリズムなのに 速度が遅いのでしょうか? VBで早くする方法が知りたいです。 ActiveBasicというものがあり、そちらで動作させると 早いといううわさがあり、本当かわかりませんが、 どうなのでしょうか?VBのコンポーネントは使えるのでしょうか? ※昔、Delphiと同じアルゴリズムで速度を比べたら Delphiの方が早かったです。理由はわかりませんが・・・