C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: Bitmapの描画速度の違い


(過去ログ 61 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■35385 / inTopicNo.1)  Bitmapの描画速度の違い
  
□投稿者/ こう (1回)-(2009/04/28(Tue) 14:18:00)

分類:[.NET 全般] 

C#.NET 2008
P4 2Ghz,512MB
にて開発を行っております。

大きなビットマップ(5000x5000程度)を読み込んで
マウスドラッグで移動できるアプリを作成しています。

ビットマップをPictureBoxのPaintイベントで描画し、描画処理は

 e.Graphics.DrawImage(bmp, x, y, bmp.Width, bmp.Height);

のようにしているのですが、描画する画像の初期処理によって、

 @FromStreamで読み込んだ場合
  →描画処理はもたつかず、滑らかに移動できる。

 AFromStreamで読み込んだ@に、LockBitsとUnsafeで画像処理を行った後に描画する
  →描画処理に時間がかかり、移動がカクカクしてしまう。

という現象がおきてしまいます。
Aでも@と同様の処理速度でDrawImage出来る方法もしくは別な解決方法などありましたら
ご教授お願い致します。
引用返信 編集キー/
■35388 / inTopicNo.2)  Re[1]: Bitmapの描画速度の違い
□投稿者/ 囚人 (348回)-(2009/04/28(Tue) 15:08:41)
(1)と(2)の処理速度の比較ですか?
(2)は、(1)プラスアルファ(LockBitsとUnsafeで画像処理を)の処理ですよね。

その「プラスアルファ」で何をしているのか具体的に書いて貰わないとアドバイスできないのでわ。
引用返信 編集キー/
■35389 / inTopicNo.3)  Re[1]: Bitmapの描画速度の違い
□投稿者/ たくボン (157回)-(2009/04/28(Tue) 15:10:44)
No35385 (こう さん) に返信
> 大きなビットマップ(5000x5000程度)を読み込んで
> マウスドラッグで移動できるアプリを作成しています。

おそらくgoogle mapみたいな感じのものを作ろうとしてると思うんですが、

>  e.Graphics.DrawImage(bmp, x, y, bmp.Width, bmp.Height);

これのbmpは、5000*5000の領域全てを描画しようとしてます?

描画を行う場合は、なるべく描画する領域を限定するのがいいと思いますね。
座標軸の計算はめんどくさいと思いますが、処理速度を気にするようなアプリでは、なるべくPG側でリソースの制御をしてあげるのが得策かも。


引用返信 編集キー/
■35390 / inTopicNo.4)  Re[2]: Bitmapの描画速度の違い
□投稿者/ こう (2回)-(2009/04/28(Tue) 15:18:59)
言葉足らずで申し訳ありません・・

Unsafeで行っている処理は色置換処理でしてRGBのビットの足し引き処理のみです。
画像サイズやフォーマット等は@とAで変わりありません。

問題となっていますのは@画像とA画像のDrawImage()の実行にかかる処理時間の比較です。
同じ大きさのビットマップなのに、Aの方がDrawImageの実行時間がかかってしまいます。



引用返信 編集キー/
■35393 / inTopicNo.5)  Re[2]: Bitmapの描画速度の違い
□投稿者/ こう (3回)-(2009/04/28(Tue) 15:36:47)
たくぼんさん

イメージとしましてはgoogle mapに近いかもしれません。
処理後のA画像のビューア的なプログラムです。

都度画面内に収まる領域のみを計算し、切り取って描画という方法も試したのですが、
結果は変わりませんでした。以下を参考にしました。
 
 http://dobon.net/vb/dotnet/graphics/triming.html

ちなみに現在とりあえず@画像の領域全てを描画してますが処理速度的には問題は出ていないのです。


蛇足ですが、A画像を一旦メモリストリームに吐き出してから
それをFromStreamで読み込みなおすと@と同様にスムーズに描画できます。
※ただストリーム出力処理に時間がかかる為、この方法も却下でした・・



引用返信 編集キー/
■35394 / inTopicNo.6)  Re[3]: Bitmapの描画速度の違い
□投稿者/ 囚人 (349回)-(2009/04/28(Tue) 15:44:57)
コード見せてもらえません?
引用返信 編集キー/
■35396 / inTopicNo.7)  Re[4]: Bitmapの描画速度の違い
□投稿者/ こう (4回)-(2009/04/28(Tue) 16:10:34)
2009/04/28(Tue) 16:31:52 編集(投稿者)
2009/04/28(Tue) 16:31:47 編集(投稿者)

余計な処理は除いてますが、以下コードです。現象は再現します。

using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Imaging;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
int x = 0;
int y = 0;
int posx = 0;
int posy = 0;
Bitmap bmp;

public Form1()
{
InitializeComponent();

this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);

bmp = (Bitmap)Image.FromStream(File.OpenRead(@"c:\test.jpg"), false, false); //←@の読込処理です。
ConvFile(); //←Aの画像処理です。ここをコメント化するかしないかで描画速度が変わります。
}

public void ConvFile()
{
BitmapData d = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int residual = d.Stride - d.Width * 3;

unsafe
{
byte* p = (byte*)(void*)d.Scan0;
for (int y = 0; y < d.Height; ++y)
{
for (int x = 0; x < d.Width; ++x)
{
p[2] += 0; //実際は計算値を代入しています
p[1] += 0;
p[0] += 0;
p += 3;
}
p += residual;
}
}

bmp.UnlockBits(d);
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(bmp, x, y, bmp.Width, bmp.Height);
}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
posx = e.X;
posy = e.Y;
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;

x -= posx - e.X;
y -= posy - e.Y;

pictureBox1.Invalidate();

posx = e.X;
posy = e.Y;
}
}
}

引用返信 編集キー/
■35398 / inTopicNo.8)  Re[5]: Bitmapの描画速度の違い
□投稿者/ 囚人 (351回)-(2009/04/28(Tue) 16:25:56)
ん〜、再現しないですね。
両者とも特にストレスなくスムーズに動きます。
DrawImage の前後で遅いんですかね。計測できますか?
引用返信 編集キー/
■35399 / inTopicNo.9)  Re[6]: Bitmapの描画速度の違い
□投稿者/ こう (5回)-(2009/04/28(Tue) 16:45:21)
> DrawImage の前後で遅いんですかね。計測できますか?

はい、まさにDrawImageの部分です。
5000x5000の画像ファイルで、DrawImageの部分を計測したところ、

@2ms
A150ms

です。私の環境が悪いのでしょうか・・・??

今、他のPC3台でも試しましたが、
やはり@とAで70倍以上の速度差が出ました。


引用返信 編集キー/
■35400 / inTopicNo.10)  Re[7]: Bitmapの描画速度の違い
□投稿者/ 囚人 (352回)-(2009/04/28(Tue) 17:03:22)
失礼しました。計測結果は確かに違いますね。
unsafe は関係なくて、LockBits するだけで違うようです。
原因はわかりませんが、LockBits の指定を PixelFormat.Format32bppRgb にすれば速度が改善されるようです。
引用返信 編集キー/
■35401 / inTopicNo.11)  Re[8]: Bitmapの描画速度の違い
□投稿者/ 囚人 (353回)-(2009/04/28(Tue) 17:05:12)

画像によって違うかもしれません。要は画像のPixelFormatを正確に判定しないといけない?
引用返信 編集キー/
■35404 / inTopicNo.12)  Re[9]: Bitmapの描画速度の違い
□投稿者/ こう (6回)-(2009/04/28(Tue) 17:36:27)
PixelFormatをFormat32bppRgbや、読み込み画像に合わせて試したり等してみましたが、
改善しませんでした。

確かにLockBitsするだけで遅くなります・・・
なぜこれだけで速度に差がでるんでしょうか
引用返信 編集キー/
■35406 / inTopicNo.13)  Re[10]: Bitmapの描画速度の違い
□投稿者/ 囚人 (354回)-(2009/04/28(Tue) 19:10:56)
ん〜、何故なんでしょうね。ちょっと調べてみますが、理由と原因はちょっとわかりません。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -