2

filedialog から画像を取得するための簡単なコードを開発しており、画像ボックスに表示したいと考えています。しかし、画像が少ないと「メモリ不足」というエラーが発生します。

ここに私のコードがあります

Dim srcmap As Bitmap
srcmap = New Bitmap(OpenFileDialog1.FileName)
Dim destbit As New Bitmap(220, 220)
Dim srcRec As New Rectangle(0, 0, srcmap.Width, srcmap.Height)
Dim destRec As New Rectangle(0, 0, 220, 220)
Dim g As Graphics
g = Graphics.FromImage(destbit)
g.DrawImage(srcmap, destRec,srcRec, GraphicsUnit.Pixel)
picturebox.Image = destbit
4

1 に答える 1

1

モバイル デバイスのリソースは限られています。Windows CE 5 ベースの OS (現在 Windows Embedded Handheld 6.5.3 と呼ばれる最新のもの) までは、各プロセスは 32MB のプログラム メモリしか取得しません。このメモリは、他のプロセスによってロードされる DLL によって制限されるため、新しいプロセスに使用できるメモリは 24MB 以下になる場合があります。

15MB (5MP 画像) 以上の画像データ全体をロードする代わりに、画像データのサムネイル表現のみをロードする必要があります。たとえば、15MB の画像データを 1MB のピクセル データのみの pictore ボックスにロードしても意味がありません。

OpenNetCF フレームワークには、ストリームを使用してサムネイルを作成するクラスがいくつか用意されています。データをロードしてからサイズ変更しようとする他の試みは失敗します。

申し訳ありませんが、C# コード例しかありません。画像ヘルパー クラスhttp://code.google.com/p/intermeccontrols/source/browse/DPAG7/Hasci.TestApp.And_Controls/IntermecControls/Hasci.TestApp を次に示します。 IntermecCamera3/ImageHelper.csで、これを使用して 5MP 画像をロードする方法を次に示しますhttp://code.google.com/p/intermeccontrols/source/browse/DPAG7/Hasci.TestApp.And_Controls/IntermecControls/Hasci.TestApp.IntermecCamera3/ IntermecCameraControl3.cs :

    OpenNETCF.Drawing.Imaging.StreamOnFile m_stream;
    Size m_size;
    /// <summary>
    /// this will handle also large bitmaps and show a thumbnailed version on a picturebox
    /// see http://blog.opennetcf.com/ctacke/2010/10/13/LoadingPartsOfLargeImagesInTheCompactFramework.aspx
    /// </summary>
    /// <param name="sFileName">the name of the file to load</param>
    private void showImage(string sFileName)
    {
        var stream = File.Open(sFileName, FileMode.Open);
        m_stream = new StreamOnFile(stream);
        m_size = ImageHelper.GetRawImageSize(m_stream);
        System.Diagnostics.Debug.WriteLine("showImage loading " + sFileName + ", width/height = " + m_size.Width.ToString() + "/"+ m_size.Height.ToString());
        //CameraPreview.Image = ImageHelper.CreateThumbnail(m_stream, CameraPreview.Width, CameraPreview.Height);
        CameraSnapshot.Image = ImageHelper.CreateThumbnail(m_stream, CameraPreview.Width, CameraPreview.Height);
        showSnapshot(true); //show still image
        m_stream.Dispose();
        stream.Close();
    }
于 2012-08-28T03:43:55.503 に答える