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 来存储所有字节:

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 回答