2

私は最近、fo-dicom を将来のプロジェクトの可能な DICOM ライブラリとして評価し始めました。

DICOM ファイルのみを読み取り、それを に変換して にSystem.Drawing.Bitmap表示する基本的な C# Windows フォーム アプリケーションを作成しましたPictureBox

public partial class TestFoDicomForm : Form
{
    public TestFoDicomForm()
    {
        InitializeComponent();

        DicomImage di               = new DicomImage("Image_01.dcm");
        Bitmap bmp                  = di.RenderImage().AsBitmap();
        this._pbDicomImage.Image    = bmp;
    }
}

このコードは機能しますが、フォームのサイズを変更し始めると、後で通知するよりも早く例外が発生します。

System.ArgumentException: パラメーターが無効です。

System.Drawing.Image.get_RawFormat()
で System.Drawing.Graphics.DrawImage(イメージ イメージ、Int32 x、Int32 y、Int32 幅、Int32 高さ)
で System.Drawing.Graphics.DrawImage(イメージ イメージ、Rectangle rect)
でSystem.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
で System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
で System.Windows.Forms.Control.WmPaint(Message& m)
で System.Windows.Forms
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message & m) の .Control.WndProc(Message& m)
System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
の System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)

例外は実際に発生しますMain()

Application.Run(new TestFoDicomForm());

try/catchしかし、効果的に何が起こるかを調査する機能を追加できませんでした。

NuGet 経由で fo-dicom 3.0.2 への参照を追加しました (プロジェクトのターゲット フレームワークは 4.6.1 です)。環境: Windows 10 Pro、VS 2017。

興味深いことに、上記のコードに示すようにビットマップを生成し、それを保存し、アプリケーションで (DICOM を参照せずに) それを読み取り、ピクチャ ボックスに配置すると、同様のことは何も起こりません。これは、問題はビットマップ自体にあると考えさせられますが、発見できませんでした。

サイズ変更時にクラッシュしない fo-dicom.1.0.37 で作成された古いテスト アプリケーションもあります。

理由が何であるか、この効果を取り除く方法、または/および私が間違っている可能性があるのは何なのか、非常に興味があります。

(テストアプリケーションは、 http://jmp.sh/UGOg8Aiからダウンロードできます)。

4

2 に答える 2

3

私の同僚は答えを知っていました。次のコードはそのことを行います:

public partial class TestFoDicomForm : Form
{
    private IImage image;

    public TestFoDicomForm()
    {
        InitializeComponent();

        this.image = new DicomImage("Image_01.dcm").RenderImage();
        Bitmap bmp = image.AsBitmap();
        this.pictureBox1.Image  = bmp;
    }
}

ここでの秘訣は、あなたのインスタンスを保存する必要があるということです(の戻り型のためIImage、必ずこの形式で として)。IImageRenderImage()

于 2018-02-06T08:51:09.043 に答える