将内存流转换为bitmapdata

时间:2013-10-02 19:21:26

标签: c# bytearray bitmapdata compact-framework2.0

我创建了一个webrequest来接收一个大的jpeg作为字节数组。这反过来可以转换为内存流。我需要将这些数据放入bitmapdata中,以便我可以再次将其复制到字节数组中。假设从内存流返回的字节数组与从bitmapdata的marshall副本返回到字节数组的字节数组不同,我是正确的吗?

我不想将内存流写入图像,因为它会因为它的大小而返回内存不足错误以及我使用紧凑型cf C#2的事实。

这是我对服务器的调用..

HttpWebRequest _request = (HttpWebRequest)WebRequest.Create("A url/00249.jpg");
                _request.Method = "GET";
                _request.Timeout = 5000;
                _request.ReadWriteTimeout = 20000;
                byte[] _buffer;
                int _blockLength = 1024;
                int _bytesRead = 0;
                MemoryStream _ms = new MemoryStream();
                using (Stream _response = ((HttpWebResponse)_request.GetResponse()).GetResponseStream())
                {
                    do
                    {
                        _buffer = new byte[_blockLength];
                        _bytesRead = _response.Read(_buffer, 0, _blockLength);
                        _ms.Write(_buffer, 0, _bytesRead);
                    } while (_bytesRead > 0);
                }

这是我从bitmapdata读取字节数组的代码。

 Bitmap Sprite = new Bitmap(_file);
        Bitmapdata RawOriginal = Sprite.LockBits(new Rectangle(0, 0, Sprite.Width, Sprite.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
        int origByteCount = RawOriginal.Stride * RawOriginal.Height;
        SpriteBytes = new Byte[origByteCount];
        System.Runtime.InteropServices.Marshal.Copy(RawOriginal.Scan0, SpriteBytes, 0, origByteCount);
        Sprite.UnlockBits(RawOriginal);

注意: 我不想用这个:

Bitmap Sprite = new Bitmap(_file);

我想从:

MemoryStream _ms = new MemoryStream();

System.Runtime.InteropServices.Marshal.Copy(RawOriginal.Scan0, SpriteBytes, 0, origByteCount);

使用所需的转换,不用写入位图。

1 个答案:

答案 0 :(得分:2)

你要问的是困难。您从响应对象接收的数据是一个完整的jpeg图像,它有一个标题,然后是一堆压缩数据字节。 Scan0寻址的字节数组是未压缩的,很可能在每条扫描线的末尾包含一些填充字节。

最重要的是,您绝对无法使用Marshal.Copy将收到的字节复制到Scan0

要执行您要求的操作,您需要解析所接收的jpeg的标头,并将图像位直接解压缩到Scan0,并根据需要填充每个扫描行。 .NET Framework中没有任何内容可以帮助您。

this question的已接听答案有一个指向可能帮助您的图书馆的链接。

即使有效,我也不确定它会帮助你。如果调用BitMap构造函数来创建图像会导致内存不足,那么几乎可以肯定这种迂回方法也是如此。

问题是你有这么多精灵,你不能将它们全部留在记忆中,未压缩?如果是这样,您可能必须找到其他方法来解决您的问题。

顺便说一下,通过将读取图像的代码更改为:

,可以省去很多麻烦
    MemoryStream _ms = new MemoryStream();
    using (Stream _response = ((HttpWebResponse)_request.GetResponse()).GetResponseStream())
    {
        _response.CopyTo(_ms);
    }