2011-09-23 969 views
8

我有一個頁面發送html5畫布數據,編碼爲base64 bmp圖像(使用此算法http://devpro.it/code/216.html)到服務器端進程,該進程將其轉換爲System.Drawing.Image對象,並執行對它進行一些操作。System.ArgumentException:參數無效

在我當地的環境,這個工作得很好,但在我的EC2實例我得到以下錯誤:

System.ArgumentException: Parameter is not valid. at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData) at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement)

我的代碼如下:

System.Drawing.Image image = null; 
string b64string = "..."; 
byte[] sf = Convert.FromBase64String(b64string); 
using (MemoryStream s = new MemoryStream(sf, 0, sf.Length)) 
{ 
    image = System.Drawing.Image.FromStream(s, false); 
} 
... 

這裏是一個文本文件一個樣本b64string,我正在測試:https://docs.google.com/leaf?id=0BzVLGmig1YZ3MTM0ODBiNjItNzk4Yi00MzI5LWI5ZWMtMzU1OThlNWEyMTU5&hl=en_US

我也試過以下,並有相同的結果:

System.Drawing.ImageConverter converter = new System.Drawing.ImageConverter(); 
image = converter.ConvertFrom(sf) as System.Drawing.Image;   

任何有識之士將不勝感激!

+0

您在本地和ec2實例上運行此框架的哪個版本? – Oded

+0

您的意思是說實際測試數據(該文件)無法在ec2實例上解碼,但可以在您的開發機器上?例如。在開發和服務器測試中不可能有不同的數據被處理。 –

+0

對不起,忘了提及.NET 4.0。 – ari

回答

5

我仍然不知道你的問題的真正原因,但我想它是關聯的圖像格式,其中Image類不承認。稍微檢查二進制數據之後,我可以形成圖像。我希望這有幫助。

Bitmap GetBitmap(byte[] buf) 
{ 
    Int16 width = BitConverter.ToInt16(buf, 18); 
    Int16 height = BitConverter.ToInt16(buf, 22); 

    Bitmap bitmap = new Bitmap(width, height); 

    int imageSize = width * height * 4; 
    int headerSize = BitConverter.ToInt16(buf, 10); 

    System.Diagnostics.Debug.Assert(imageSize == buf.Length - headerSize); 

    int offset = headerSize; 
    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      bitmap.SetPixel(x, height - y - 1, Color.FromArgb(buf[offset + 3], buf[offset], buf[offset + 1], buf[offset + 2])); 
      offset += 4; 
     } 
    } 
    return bitmap; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (FileStream f = File.OpenRead("base64.txt")) 
    { 
     byte[] buf = Convert.FromBase64String(new StreamReader(f).ReadToEnd()); 

     Bitmap bmp = GetBitmap(buf); 
     this.ClientSize = new Size(bmp.Width, bmp.Height); 
     this.BackgroundImage = bmp; 
    } 
} 
+0

謝謝!這讓我更加接近。結果輸出確實會改變顏色 - R和B交換? 原創:http://i.imgur.com/a0UXf.gif 輸出:http://i.imgur.com/TVUmk.gif (注:黑色背景可能是因爲畫布數據轉換) – ari

+0

你有解碼代碼的來源? – ari

+0

來源?不,我做到了。我不知道原始圖像。所以,你要玩一點點,像這樣'bitmap.SetPixel(X,高度SetPixel - Y - 1,Color.FromArgb(BUF [偏移+ 3],BUF [偏移+ 2],BUF [偏移+1] ,BUF [偏移]));'注:我交換'的buf [偏移+ 2]'和'BUF [偏移]' –

3

發佈的代碼似乎是正確的。我已經測試過它,它工作正常。

異常 「System.ArgumentException:參數是無效的。」沒有任何其他提示(特別是不是參數的名稱)是GDI +(.NET Image類背後的基礎技術)標準的InvalidParameter錯誤的包裝,它不會告訴使用何種參數無效。

因此,在使用.NET Reflector的FromStream代碼之後,我們可以看到GDI +調用中使用的參數本質上......輸入流。

所以我的猜測是,你所提供的輸入流有時爲圖像無效?您應該保存失敗的輸入流(例如使用File.SaveAllBytes(sf))以供進一步調查。

+0

'所以我的猜測是,你所提供的輸入流是無效的,有時作爲一個形象呢?'你覺得什麼樣的數據?圖像類無法加載,但我認爲這是正確的。 –

+0

@ L.B - 我可以成功地將樣例數據(由OP給出的鏈接)作爲.BMP加載。 –

+0

但我不能用我的XP-Home(32位)。我得到同樣的錯誤'參數無效' –

0

這可能發生,如果sf包含無效的圖像數據。驗證您傳遞到數據流中的數據的有效性,並查看是否解決了您的問題。