C# 使用MemoryStream时参数无效

C# 使用MemoryStream时参数无效,c#,bitmap,bit-manipulation,memorystream,C#,Bitmap,Bit Manipulation,Memorystream,我正在用c#制作一些位图图像处理应用程序,所以我需要隐式地将图像转换为bmp,这样我就可以像字节[](字节数组)一样处理它。当此图像不是bmp格式时出现问题-在这种情况下,在我将其转换为位图,并将此位图转换为字节[]并应用一些函数(顺便说一下,我“避免”了前53个字节-标题字节)后,当尝试在此字节[]上使用MemoryStream实例新位图时,应用程序中断并收到“参数无效”消息 代码如下: public void load(PictureBox pom) { OpenFileDialog

我正在用c#制作一些位图图像处理应用程序,所以我需要隐式地将图像转换为bmp,这样我就可以像字节[](字节数组)一样处理它。当此图像不是bmp格式时出现问题-在这种情况下,在我将其转换为位图,并将此位图转换为字节[]并应用一些函数(顺便说一下,我“避免”了前53个字节-标题字节)后,当尝试在此字节[]上使用MemoryStream实例新位图时,应用程序中断并收到“参数无效”消息

代码如下:

public void load(PictureBox pom)
{
    OpenFileDialog o = new OpenFileDialog();

    //o.Filter = "bin files (*.bin)|*.bin";

    if (o.ShowDialog() == DialogResult.OK)
    {
        Bitmap b = (Bitmap)Image.FromFile(o.FileName);

        pom.Image = b;

        //pom.Image = new Bitmap(o.FileName);
        this.p = pom;
        this.input_bin_fajl = File.ReadAllBytes(o.FileName);
        this.output_bin_fajl = new byte[this.input_bin_fajl.Length];
    }
}

public static Bitmap ByteToImage(byte[] blob)
{
    using (MemoryStream mStream = new MemoryStream())
    {
        mStream.Write(blob, 0, blob.Length);
        mStream.Seek(0, SeekOrigin.Begin);

        // this is the breaking point
        Bitmap bm = new Bitmap(mStream);
        //

        return bm;
    }
}

这是它使用的代码,再次感谢:)

void预览(位图bm,int i)
{
BitmapData bmData=bm.LockBits(新矩形(0,0,bm.Width,bm.Height),ImageLockMode.ReadWrite,bm.PixelFormat);
int stride=bmData.stride;
System.IntPtr Scan0=bmData.Scan0;
不安全的
{
字节*p=(字节*)(空*)扫描0;
int nOffset=步幅-bm.宽度*3;
int nWidth=bm.宽度*3;
对于(整数y=0;y
“顺便说一句,我“避免”了前53个字节——标题字节——你能告诉我们更多吗?这听起来可能是问题所在……BMP格式图像的前53个字节是标题字节,之后是描述像素的字节。因此,为了更改图像内容,您必须保持此字节不变,以保留基本图像信息。但是,是什么让您认为
位图
构造函数希望您先删除标题?它需要这些信息来了解图像的大小,以及可能的任何压缩。基本上,您应该将整个数据传递给
Bitmap
构造函数。它不像头只是垃圾字节…不,你误解了我-我在操作过程中跳过了它们,这就是我避免它们的意思。我想说的是,我没有违反这些字节,但我只是复制了它们。如果标题包含任何类型的校验和信息,这肯定可以解释它。此外,您的“操作”是否对数据是否被压缩等做出了任何假设?通常,您只需加载数据,然后获取内存中的表示,修改该表示,然后再次将其保存为图像。也许你可以提供一个简短但完整的程序来演示这个问题?
    void preview(Bitmap bm, int i)
    {
        BitmapData bmData = bm.LockBits(new Rectangle(0,0,bm.Width,bm.Height), ImageLockMode.ReadWrite, bm.PixelFormat);
        int stride = bmData.Stride;
        System.IntPtr Scan0 = bmData.Scan0;

        unsafe
        {
            byte* p = (byte*)(void*)Scan0;
            int nOffset = stride - bm.Width * 3;
            int nWidth = bm.Width * 3;

            for (int y = 0; y < bm.Height; ++y)
            {
                for (int x = 0; x < bm.Width; ++x)
                {
                    switch (i)
                    {
                        case 0:
                            {
                                p[0] = (byte)0;
                                p[1] = (byte)0;
                                break;
                            }
                        case 1:
                            {
                                p[0] = (byte)0;
                                p[2] = (byte)0;
                                break;
                            }
                        default:
                            {
                                p[1] = (byte)0;
                                p[2] = (byte)0;
                                break;
                            }                               
                    }
                    p+=3;
                }
                p += nOffset;
            }
        }

        bm.UnlockBits(bmData);
    }