0

既存のファイルからの画像の表示に問題があります...

try
{   
    bool EndFlag = false;
    string fileLoc = @"../../../../samples/jpeg_" + DateTime.Now.ToString("yyyyMMdd_hhmmss") + ".jpg";
    //Create a file Stream to save the body of the JPEG File content.
    FileStream fs = null;
    fs = new FileStream(fileLoc, FileMode.OpenOrCreate, FileAccess.Write);

    do 
    {
        ReadJpegFileCommand(); 
        CamPort.DiscardOutBuffer();
        CamPort.DiscardInBuffer();

        for (int i = 0; i < 5; i++)
            header[i] = (byte)CamPort.ReadByte();

         if (((int)header[0] == 0x76) && (header[1] == 0x00) && (header[2] == 0x32) && (header[3] == 0x00) && (header[4] == 0x00))
             {
                for (int i = 0; i < 32; i++)
                        ImageBody[i] = (byte)CamPort.ReadByte();
              /* 
                 * writing the bytes that have been read till now to a file 
              */                    

                    fs.Write(ImageBody, 0, ImageBody.Length);

                    for (int i = 1; i < ImageBody.Length; i++)     // check if reached to the last two bytes(FF D9) of the body to  stop reading the body.
                    {
                        if ((ImageBody[i - 1] == 0xFF) && (ImageBody[i - 0] == 0xD9))
                        {
                            EndFlag = true;
                            MessageBox.Show("FFD9 has been received");
                            OneSnap.Image =(Bitmap)System.Drawing.Image.FromStream(fs);
                            fs.Close();

                        }
                    }
             }
         else
         {
             MessageBox.Show("Error,Try again"); // The first 5 bytes does not match the header 

         }


         for (int i = 0; i < footer.Length; i++)
         {
             footer[i] = (byte)CamPort.ReadByte();
         }



         // update the starting address 

         M += (UInt16)ImageBody.Length;
         //Progress.PerformStep();


        }while(!EndFlag);


    }



catch (System.Exception ex) { MessageBox.Show(ex.Message); }

私がこのステートメントを使用したとき:

OneSnap.Image =(Bitmap)System.Drawing.Image.FromStream(fs);
                                                            fs.Close();

このエラーが発生しました:「パラメータが無効です」

しかし、私が別の方法で試し、前のステートメントを::に置き換えたとき

 fs.Close();
OneSnap.Image =(Bitmap)System.Drawing.Image.FromFile(fileLoc);

画像ボックスに画像を表示しました..しかし、プログラムをさらに実行すると、このエラーが発生しました::「メモリ不足」で画像ボックスに画像が表示されませんでした(OneSnap)>>>解決方法これ ??

サンプル::(この画像はリンクSprite Jpeg Cameraによってキャプチャされています)

ここに画像の説明を入力してください

4

1 に答える 1

2

作成したファイルは有効な画像ではないため、ビットマップに変換できません。

公式ドキュメントを参照してください:

例外条件
-------------------------------
OutOfMemoryExceptionファイルに有効な画像形式がありません。
                      -また-
                      GDI +は、ファイルのピクセル形式をサポートしていません。

これを「修正」する方法はわかりませんが、画像ビューアでファイルを表示して確認することはできます。それを表示できる場合は、System.Drawingが提供するものよりも複雑なものが必要になる場合があります。

編集:私たちの誰もが想像したよりも簡単かもしれません。行の順序を変更してみてください。

fs.Close();
OneSnap.Image =(Bitmap)System.Drawing.Image.FromStream(fs);

ストリームが開いている間は、ビットマップの内部コードをファイルから読み取ることができない可能性があります。

別のアプローチは、代わりにMemoryStreamを使用することです。このために、最初にすべてのバイトを格納するリストを追加します。

List<byte> arrAllBytes = new List<byte>();

この行の代わりに:

fs.Write(ImageBody, 0, ImageBody.Length);

このコードを持っている:

arrAllBytes.AddRange(ImageBody);

そして最後に:

MemoryStream stream = new MemoryStream(arrAllBytes.ToArray())
OneSnap.Image = System.Drawing.Image.FromStream(stream);
于 2013-02-06T13:55:17.240 に答える