2011-09-23 47 views
8

私は、このアルゴリズムhttp://devpro.it/code/216.htmlを使用してBase64 bmpイメージとしてエンコードされたhtml5 canvasデータを、それを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インスタンスでデコードできないのですが、devマシン上にある可能性がありますか?例えば。デベロッパーとサーバーテストで異なるデータが処理される可能性はありません。 –

+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

Doデコードコードのソースがありますか? – ari

+0

ソース?いいえ、私はそれを作った。私は元のイメージを知らない。このようにBitmap.SetPixel(x、height-y-1、Color.FromArgb(buf [offset + 3]、buf [offset + 2]、buf [offset + 1])のようにSetPixelをちょっと再生する必要があります。 、buf [offset])); '注意:私は' buf [offset + 2] 'と' buf [offset] 'をスワップしました。 –

3

投稿されたコードは正しいようです。私はそれをテストし、それは正常に動作します。

例外 "System.ArgumentException:パラメータが無効です。"他のヒントなし(特にパラメータの名前ではない)は、GDI +(.NET Imageクラスの背後にある基礎技術)標準のInvalidParameterエラーのラッパーで、どのパラメータが無効であるかを正確には伝えません。

したがって、.NET ReflectorでFromStreamコードを実行すると、GDI +呼び出しで使用されるパラメータは本質的に...入力ストリームであることがわかります。

私が推測する入力ストリームは、画像として無効になることがありますか?さらなる調査のために、失敗した入力ストリーム(たとえばFile.SaveAllBytes(sf)を使用して)を保存する必要があります。

+0

「私の推測では、あなたが提供する入力ストリームが画像として無効な場合がありますか?」サンプルデータについてどう思いますか?イメージクラスの読み込みに失敗しましたが、どういうわけか正しいと思います。 –

+0

@ L.B - サンプルデータ(OPによって与えられたリンク)を.BMPとして正常に読み込むことができます。 –

+0

しかし私は私のXP-Home(32bit)ではできません。 'Parameter is not valid'と同じエラーが発生する –

0

sfに無効な画像データが含まれている場合に発生する可能性があります。ストリームに渡すデータの有効性を確認し、問題が解決するかどうか確認します。

関連する問題