Image.FromStream的无效参数问题

polinzhuo 2007-06-13 01:57:31
目的:将数组的内容显示在窗口中。

我建立了一个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出现错误呢?
哪位能帮帮我啊,先谢过了
...全文
5632 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
StGrandet 2007-06-22
  • 打赏
  • 举报
回复
帧头的问题
google一下“wiki bmp”,里面会有详细的信息
bmp应该是有54个字节的头,好像还有一些其他的附加信息,一个bmp肯定不会是rgb值的一个简单的byte[],头部错了就抛异常
li45214521 2007-06-14
  • 打赏
  • 举报
回复
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));

polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
那么如何以图像的方式显示数组的值呢?
我想对图像进行算法处理,以数组的形式表示图像最为方便,处理结束后,将数组再以图像的方式显示出来
现在我想建立一幅全白的图像,以数组的形式表现就是全是255的Byte数组,
byte[] DataArray = new byte[ArrayLength];
for (int i = 0; i < ArrayLength; i++)
DataArray[i] = 255;
如何将这个数组以图像的形式显示出来呢?
soaringbird 2007-06-14
  • 打赏
  • 举报
回复
Graphics g= pictureBox1.CreateGraphics();
g.FillRectangle(Brushes.White, 1, 1, pictureBox1.Width, pictureBox1.Height);
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
谢谢大家,如何将内部数值转换为图像数据呢?
正如我的代码,想显示一幅全白的图像,如何对数组赋值呢?
soaringbird 2007-06-14
  • 打赏
  • 举报
回复
比较DataArray 和imagearray维数相同、大小相同、唯一不同的就是内部的数值。为什么在Image.FromStream出现错误呢?


内部数值不是图像数据,当然会出现错误了
guxingdao 2007-06-14
  • 打赏
  • 举报
回复
byte[] DataArray = new byte[ArrayLength];
for (int i = 0; i < ArrayLength; i++)
DataArray[i] = 255;

MemoryStream DataStream = new MemoryStream(DataArray);
你这样生成的数组有意义吗?
计算机不认识这个数组里的图形是正常的
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
异常信息很少,就是参数无效。
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
如何定义数组格式呢?比如byte[] DataArray = new byte[ArrayLength];
已经赋值,如何定义像素格式呢?
liyihui2001 2007-06-14
  • 打赏
  • 举报
回复
看看异常信息,应该是数组的格式不对,不能随便定义一个数组就当图形用
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
我建立后马上传给Image了,如下:
MemoryStream DataStream = new MemoryStream(DataArray);
image = Image.FromStream(DataStream);

还有我的第二段代码是将一幅图像数据写到流中 ,将这个流传给Image却能正常显示。应该不会是提前关闭的问题。
谢谢
Jinwmmail() 的回复
Jinwmmail 2007-06-14
  • 打赏
  • 举报
回复
楼主看是不是 from 的那个流提前关闭了?
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
有人遇到过类似的问题吗
polinzhuo 2007-06-14
  • 打赏
  • 举报
回复
自己顶!
dingxinbei 2007-06-14
  • 打赏
  • 举报
回复
有一些头信息,只要前面正确(具体多少字节我也不知道(查查看jpg图像格式的定义),但是我在传输文件的时候遇到过),后面的可以是随意的字节,出现的就是一个随意的图片,但是tiff或bitmap格式可能不行,应为他们要求比较严格,任何错误都会导致不能显示。
IT_zen 2007-06-14
  • 打赏
  • 举报
回复
强烈关注
vision_n 2007-06-14
  • 打赏
  • 举报
回复
遇到过类似问题
li45214521 2007-06-14
  • 打赏
  • 举报
回复
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));
}



这样就可以对数组操作
li45214521 2007-06-14
  • 打赏
  • 举报
回复
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));
}
-------------------------------------------
这样就可以对数组操作
-------------------------------------------------

polinzhuo 2007-06-13
  • 打赏
  • 举报
回复
我就是想将一个byte数组导入到Image中,并显示出来。而不是Image的列表
加载更多回复(1)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧