2013-10-02 42 views
0

我製作了一個webrequest來接收一個大的jpeg作爲字節數組。這又可以被轉換爲存儲流。我需要將這些數據轉換爲位圖數據,以便我可以再次將它複製到字節數組中。我是否認爲從內存流返回的字節數組與從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); 

是必要的沒有寫入位圖。

+0

爲什麼不使用一個FileStream:

順便說一句,你可以通過改變你的代碼的圖像讀取保存自己很多的麻煩?我猜你在說你沒有內存空間,但是在文件系統上有空間嗎? – CrazyDart

+0

@CrazyDart嗨,謝謝你的回覆。最終的問題是將這個較大的圖像的部分提取到較小的圖像(又名雪碧)。我不知道這是可能的使用文件流。感謝您的想法,雖然... –

回答

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方法是不是在緊湊型CF不幸的是,我:(可用。我將讓這個問題去有點接受你的答案明確之前,雖然我相信這是很難實現的。 –

+0

HI同樣,兩件事情。就你知道這個庫是否可以加載和壓縮現有的JPEG?如果是的話,你將有示例代碼,因爲我發現很難找到在下載的樣本,因爲沒有「入門」的東西。雖然這不是我最初的問題,我會認爲這是一種你分享你有任何的知識感謝 –