将内存流转换为位图数据



我发出一个网络请求来接收一个大的jpeg作为字节数组。这反过来又可以转换为内存流。 我需要将此数据放入位图数据中,以便我可以再次将其编组复制到字节数组中。我假设从内存流返回的字节数组与从位图数据的编组副本返回到字节数组的字节数组不同是否正确?

不想将内存流写出到图像中,因为它的大小以及我正在使用紧凑的 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);
                }

这是我从位图数据中读取字节数组的代码。

 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);

使用所需的任何转换,而无需写入位图。

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

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

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

这个问题的接受答案有一个指向可能对您有所帮助的库的链接。

即使这有效,我也不确定它会帮助你。如果调用 BitMap 构造函数来创建图像导致内存不足,则几乎可以肯定此环形交叉路口方法也会耗尽内存。

问题是你有太多的精灵,以至于你不能把它们全部保存在内存中,未压缩?如果是这样,您可能需要找到其他方法来解决问题。

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

    MemoryStream _ms = new MemoryStream();
    using (Stream _response = ((HttpWebResponse)_request.GetResponse()).GetResponseStream())
    {
        _response.CopyTo(_ms);
    }

相关内容

  • 没有找到相关文章

最新更新