目的:将数组的内容显示在窗口中。我建立了一个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出现错误呢?
哪位能帮帮我啊,先谢过了
{
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出现错误呢?
哪位能帮帮我啊,先谢过了
DataArray[i] = 255;
你这个哪里是Image数组 一定要是Image文件数组才行
MemoryStream DataStream = new MemoryStream(DataArray);
image = Image.FromStream(DataStream);还有我的第二段代码是将一幅图像数据写到流中 ,将这个流传给Image却能正常显示。应该不会是提前关闭的问题。
谢谢
Jinwmmail() 的回复
已经赋值,如何定义像素格式呢?
for (int i = 0; i < ArrayLength; i++)
DataArray[i] = 255; MemoryStream DataStream = new MemoryStream(DataArray);
你这样生成的数组有意义吗?
计算机不认识这个数组里的图形是正常的
内部数值不是图像数据,当然会出现错误了
g.FillRectangle(Brushes.White, 1, 1, pictureBox1.Width, pictureBox1.Height);
我想对图像进行算法处理,以数组的形式表示图像最为方便,处理结束后,将数组再以图像的方式显示出来
现在我想建立一幅全白的图像,以数组的形式表现就是全是255的Byte数组,
byte[] DataArray = new byte[ArrayLength];
for (int i = 0; i < ArrayLength; i++)
DataArray[i] = 255;
如何将这个数组以图像的形式显示出来呢?
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));
{
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));
}
-------------------------------------------
这样就可以对数组操作
-------------------------------------------------
{
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));
}这样就可以对数组操作
google一下“wiki bmp”,里面会有详细的信息
bmp应该是有54个字节的头,好像还有一些其他的附加信息,一个bmp肯定不会是rgb值的一个简单的byte[],头部错了就抛异常