目的:将数组的内容显示在窗口中。我建立了一个byte数组,并初始化,然后写入到流中,建立Bitmap对象,使用FromStream导入内存流,编译通过,运行到Image.FromStream处显示无效参数异常。不知道为什么。我把代码贴出来,大家帮我分析分析到底哪的问题:    public partial class Form1 : Form
    {
        public Form1()
        {
            long ArrayLength = 10000;
            byte[] DataArray = new byte[ArrayLength];
            for (int i = 0; i < ArrayLength; i++)
                DataArray[i] = 255;            MemoryStream DataStream = new MemoryStream(DataArray);
            image = Image.FromStream(DataStream);
            InitializeComponent();
        }        private Image image;
        private Bitmap img;        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(image, 0, 0);        }
     }
代码在            image = Image.FromStream(DataStream);
处出现异常。为了进行比较,我导入一幅图像,并把图像写入内存流中,再导出到数组中,
将新数组仿照上述代码描述的过程,写入内存流中,建立Bitmap对象,使用FromStream导入内存流,发现可以正常显示。比较代码如下:
    public partial class Form1 : Form
    {
        public Form1()
        {            img = new Bitmap("C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\124.JPG");
            MemoryStream ImageStream = new MemoryStream();
            img.Save(ImageStream, ImageFormat.Bmp);
            byte[] imagearray = ImageStream.ToArray();
            long ArrayLength = imagearray.Length;            byte[] DataArray = new byte[ArrayLength];
            for (int i = 0; i < ArrayLength; i++)
                DataArray[i] = 255;             MemoryStream DataStream = new MemoryStream(DataArray);            MemoryStream ImgStream = new MemoryStream(imagearray);            image = Image.FromStream(DataStream);
            InitializeComponent();
        }        private void Form1_Load(object sender, EventArgs e)
        {
        }
        private Image image;
        private Bitmap img;        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(image, 0, 0);        }
比较DataArray 和imagearray维数相同、大小相同、唯一不同的就是内部的数值。为什么在Image.FromStream出现错误呢?
哪位能帮帮我啊,先谢过了

解决方案 »

  1.   

    for (int i = 0; i < ArrayLength; i++)
    DataArray[i] = 255;
    你这个哪里是Image数组  一定要是Image文件数组才行
      

  2.   

    我就是想将一个byte数组导入到Image中,并显示出来。而不是Image的列表
      

  3.   

    楼主看是不是 from  的那个流提前关闭了?
      

  4.   

    我建立后马上传给Image了,如下:
                MemoryStream DataStream = new MemoryStream(DataArray);
                image = Image.FromStream(DataStream);还有我的第二段代码是将一幅图像数据写到流中 ,将这个流传给Image却能正常显示。应该不会是提前关闭的问题。
    谢谢
    Jinwmmail() 的回复
      

  5.   

    如何定义数组格式呢?比如byte[] DataArray = new byte[ArrayLength];
    已经赋值,如何定义像素格式呢?
      

  6.   

    byte[] DataArray = new byte[ArrayLength];
                for (int i = 0; i < ArrayLength; i++)
                    DataArray[i] = 255;            MemoryStream DataStream = new MemoryStream(DataArray);
    你这样生成的数组有意义吗?
    计算机不认识这个数组里的图形是正常的
      

  7.   

    比较DataArray 和imagearray维数相同、大小相同、唯一不同的就是内部的数值。为什么在Image.FromStream出现错误呢?
    内部数值不是图像数据,当然会出现错误了
      

  8.   

    Graphics g= pictureBox1.CreateGraphics();
                g.FillRectangle(Brushes.White, 1, 1, pictureBox1.Width, pictureBox1.Height);
      

  9.   

    那么如何以图像的方式显示数组的值呢?
    我想对图像进行算法处理,以数组的形式表示图像最为方便,处理结束后,将数组再以图像的方式显示出来
    现在我想建立一幅全白的图像,以数组的形式表现就是全是255的Byte数组,
                byte[] DataArray = new byte[ArrayLength];
                for (int i = 0; i < ArrayLength; i++)
                    DataArray[i] = 255;
    如何将这个数组以图像的形式显示出来呢?
      

  10.   

    LZ 没有学过颜色的结构吗?
    Image.FromStream()
    ------------------------
    只识别常见的图象格式的流
    Bitmap b = new Bitmap(10, 10);
                for(int x=0;x<10;x++)
                {
                    for(int y=0;y<10;y++)
                    {
                        b.SetPixel(x, y, Color.Black);
                    }
                }
                MemoryStream m=new MemoryStream();
                b.Save(m, ImageFormat.Bmp);            Graphics g = e.Graphics;
                Image bb = Image.FromStream(m);
                g.DrawImage(bb, new Point(0, 0));
      

  11.   

    unsafe
                {
                    Bitmap b = new Bitmap(100, 100);
                    MemoryStream m = new MemoryStream();
                    BitmapData bbb = new BitmapData();
                    bbb.Height = 100;
                    bbb.PixelFormat = PixelFormat.Format32bppArgb;
                    bbb.Width = 100;
                    bbb.Stride = 1;
                    byte* pbb = stackalloc byte[10000];
                    for (int i = 0; i < 10000; i++,++pbb)
                    {
                        *pbb = 200;
                    }
                    bbb.Scan0 = (System.IntPtr)pbb;                b.LockBits(new Rectangle(0, 0, 100, 100),ImageLockMode.WriteOnly,PixelFormat.Format32bppArgb,bbb); 
                    b.UnlockBits(bbb);
                    
                    b.Save(m, ImageFormat.Bmp);                Graphics g = e.Graphics;
                    Image bba = Image.FromStream(m);
                    g.DrawImage(bba, new Point(0, 0));
                }
    -------------------------------------------
    这样就可以对数组操作
    -------------------------------------------------
      

  12.   

    unsafe
                {
                    Bitmap b = new Bitmap(100, 100);
                    MemoryStream m = new MemoryStream();
                    BitmapData bbb = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
                    IntPtr ptr = bbb.Scan0;
                    byte[] byteData = new byte[b.Width * b.Height * 3];
                    System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, b.Width * b.Height * 3);
                    for (int i = 0; i < byteData.Length; i += 2)
                    {
                        byteData[i] = 255;
                        byteData[i + 1] = 200;
                        //byteData[i + 2] =104;
                    }
                    System.Runtime.InteropServices.Marshal.Copy(byteData,0, ptr,b.Width * b.Height * 3);
                    b.UnlockBits(bbb);
                 
                    
                    b.Save(m, ImageFormat.Bmp);                Graphics g = e.Graphics;
                    Image bba = Image.FromStream(m);
                    ImageAttributes im = new ImageAttributes();
                    
                    g.DrawImage(bba, new Point(0, 0));
                }这样就可以对数组操作
      

  13.   

    有一些头信息,只要前面正确(具体多少字节我也不知道(查查看jpg图像格式的定义),但是我在传输文件的时候遇到过),后面的可以是随意的字节,出现的就是一个随意的图片,但是tiff或bitmap格式可能不行,应为他们要求比较严格,任何错误都会导致不能显示。
      

  14.   

    帧头的问题
    google一下“wiki bmp”,里面会有详细的信息
    bmp应该是有54个字节的头,好像还有一些其他的附加信息,一个bmp肯定不会是rgb值的一个简单的byte[],头部错了就抛异常