2013-10-02 6 views
0

Я создаю веб-запрос для получения большого jpeg в виде массива байтов. Это, в свою очередь, может быть преобразовано в поток памяти. Мне нужно получить эти данные в bitmapdata, чтобы я мог снова скопировать его в массив байтов. Действительно ли я полагаю, что массив байтов, возвращенный из потока памяти, не совпадает с байтовым массивом, возвращаемым из marshall-копии битмапдата в массив байтов?Преобразование потока памяти в bitmapdata

Я не хочу писать в памяти поток к изображению, как он будет возвращать аут ошибки памяти из-за его размера и тот факт, я использую компактный 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); 

с помощью каких-либо преобразований необходимы без запись в растровое изображение.

+0

И почему бы не использовать FileStream? Я предполагаю, что вы говорите, что у вас нет места в памяти, но у вас есть место в файловой системе? – CrazyDart

+0

@CrazyDart HI, спасибо за ваш ответ. Конечная проблема заключается в том, чтобы извлечь части этого большего изображения на более мелкие изображения (aka Sprite).Я бы не знал, возможно ли это с помощью фильтра. Спасибо за ваши мысли, хотя ... –

ответ

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); 
    } 
+0

Привет, Джим, спасибо, что нашли время, чтобы помочь. Проблемы в том, что работа с большими изображениями может вызвать исключения из памяти, особенно на мобильных устройствах. Я использую спрайты, чтобы содержать кадры видео, которое вы видите. Я буду отображать изображения как и когда мне нужны они, полученные из массива байтов, а не отсечение местоположения, как я бы с div на веб-сайте. Решение заключалось в том, чтобы использовать серию меньших изображений/спрайтов, удалять заголовки (и т. Д.) Из массива байтов или/и выполнять преобразование на сервере в bitmpdata, поскольку допуск для больших изображений выше. –

+0

Метод copyto недоступен в компактном компакт-диске, к сожалению, для меня :(Я задам этот вопрос немного, прежде чем принимать ваш ответ как определенный, хотя я уверен, что его трудно достичь. –

+0

HI Опять 2 вещи. вы знаете, может ли эта библиотека загружать и сжимать существующий jpeg? Если это так, у вас будет образец кода, так как мне трудно найти образец в загружаемых файлах, так как нет «начала работы». Хотя это не было моим начальным Вопрос: Я бы хотел, чтобы вы делились любыми знаниями, которые у вас есть? Спасибо –

Смежные вопросы