- PR -

PictureBoxサイズ変更にて例外発生しました

投稿者投稿内容
フォチュヒロ
会議室デビュー日: 2005/08/04
投稿数: 10
投稿日時: 2006-06-14 10:40
こんにちは。よろしくお願いします。

PanelにPictureBoxをAutoScrollをONにして画像を表示させています。
画像を拡大させるために、
pictureBox.WidthとpictureBox.Heightに、倍率をかけてRefresh()しますと、例外が発生してしまいます。
画像サイズ×800%とか1600%とか大きいサイズになったときに発生するようです。
try/catchでそこをくくってDEBUG上で例外取得出来ますが製品にすると、例外が取得出来ず以下の例外が発生してしまいます。

************** 例外テキスト **************
System.ComponentModel.Win32Exception: この操作を正しく終了しました。
at System.Windows.Forms.DibGraphicsBufferManager.CreateCompatibleDIB(IntPtr hdc, IntPtr hpal, Int32 ulWidth, Int32 ulHeight, IntPtr& ppvBits)
at System.Windows.Forms.DibGraphicsBufferManager.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)
at System.Windows.Forms.DibGraphicsBufferManager.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetBounds)
at System.Windows.Forms.DibGraphicsBufferManager.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetBounds)
at System.Windows.Forms.DibGraphicsBufferManager.AllocBuffer(IntPtr target, Rectangle targetBounds)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

結局、バッファが足りないから出来ないのでしょうか。
御教授頂けると助かります。
お忙しいところすいませんがよろしくお願いします。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-14 14:47
はじめまして、深山です

引用:

フォチュヒロさんの書き込み (2006-06-14 10:40) より:

結局、バッファが足りないから出来ないのでしょうか。



まず足りないのは、フォチュヒロさんが実行している環境(コードや画像サイズ含む)の提示ではないでしょうか?

例外テキストだけでは、推測の域を超えないと思いますよ。

フォチュヒロ
会議室デビュー日: 2005/08/04
投稿数: 10
投稿日時: 2006-06-14 15:02
はじめまして。RESありがとうございます。
そうでした。環境記載するの忘れてました。

こちらの環境は、
開発環境:Microsoft Visual Studio .NET 2003Pro
言語:C#
OS:WinXP Pro
CPU:P4(1.4G)x2
MEMORY:2G

です。
.NET Frameworkを使用した開発を行なっております。

画像サイズは、1600x1200のIMAGEを表示させています。
これを16倍して
this.pictureBox_aaa.Width = width;
this.pictureBox_aaa.Height = height;
pictureBox_YuvDisp.Refresh();
とすると例外が発生します。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-14 16:49
引用:

フォチュヒロさんの書き込み (2006-06-14 10:40) より:

try/catchでそこをくくってDEBUG上で例外取得出来ますが製品にすると、例外が取得出来ず以下の例外が発生してしまいます。



今回、提示されたエラーやメモリ不足の場合は、
コード:

/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
try
{
Application.Run(new Form1());
}
catch(OutOfMemoryException mEx)
{
//メモリ不足
MessageBox.Show(mEx.Message);
}
catch(Win32Exception win32Ex)
{
//Win32 エラー コード
MessageBox.Show(win32Ex.Message);
}
}


とすることで、取得出来ると思います。

引用:

this.pictureBox_aaa.Width = width;
this.pictureBox_aaa.Height = height;
pictureBox_YuvDisp.Refresh();


上記のコードでは、pictureBox_aaaとpictureBox_YuvDispの関係が分からないのですが、
両方のPictureBoxをAutoSizeに設定してますか?

pictureBox_aaaをAutoSizeに設定していない場合、Win32Exceptionの例外が起こると思います。


[ メッセージ編集済み 編集者: 深山 編集日時 2006-06-14 16:54 ]

[ メッセージ編集済み 編集者: 深山 編集日時 2006-06-14 16:58 ]
フォチュヒロ
会議室デビュー日: 2005/08/04
投稿数: 10
投稿日時: 2006-06-14 17:31
申し訳ありません。
---------------------------------------------------------
this.pictureBox_aaa.Width = width;
this.pictureBox_aaa.Height = height;
this.pictureBox_aaa.Refresh();
---------------------------------------------------------
の間違いです。

pictureBox_aaaをAutoSizeに設定していません。
AutoSizeにすると、PictureBox のサイズが、格納しているイメージと同じ大きさになってしまうためです。
仕様としましては、PictureBoxのサイズ変更にて、画像が拡大されスクロールバーが表示しようとしています。

もとネタは、
件名:PictureBoxの描画範囲について
投稿日時: 2005-07-26 02:17
にあるのを参考にしました。
pictureBoxをDockFullにはしていませんが。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-14 20:09
引用:

フォチュヒロさんの書き込み (2006-06-14 10:40) より:

PanelにPictureBoxをAutoScrollをONにして画像を表示させています。
画像を拡大させるために、
pictureBox.WidthとpictureBox.Heightに、倍率をかけてRefresh()しますと、例外が発生してしまいます。



引用:

結局、バッファが足りないから出来ないのでしょうか。



原因としては、Refresh()が原因ではなく、PictureBoxのサイズが大き過ぎるため、
.NET Frameworkの処理内でエラーが起きているのだと思います。

拡大したピクチャーをファイル出力するのでなければ、
分割して拡大してはどうでしょう?
フォチュヒロ
会議室デビュー日: 2005/08/04
投稿数: 10
投稿日時: 2006-06-15 09:24
大変参考になります。
こちらも内部エラーと認識しています。

「分割して拡大」は避けたいと思っております。
PDFのように、クリックで画像をつかんでスライド移動する仕様を入れ込んでありますので、表示がちらつくのが懸念されるためであります。

「拡大したピクチャーをファイル出力する」について、
もう少しお聞きして宜しいでしょうか。

お忙しいところすいませんが宜しくお願いいたします。
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2006-06-15 10:09
画像はBitmapクラスで保持して,PictureBoxに必要なところだけをGraphicsクラスで描画したらどうでしょうか。
スクロールバーが出ませんが,これは自分でコントロールを配置すればよいと思います。

スキルアップ/キャリアアップ(JOB@IT)