0

ハードコードされたビットマップ イメージをビットマップ オブジェクトに読み込もうとしています。同じエラーが発生し続けます:

System.ArgumentException: パラメーターが無効です。

これは私が持っているコードです...

const string fakeByteData = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";

Stream stream = new MemoryStream(Encoding.ASCII.GetBytes(fakeByteData));
var bitmap = new Bitmap(stream);

usingはい、このバイト データの一部がエラーを起こしている理由を確認しようとしていたので、破棄されたものに関する ' ' ステートメントは使用していません。これは、非常に一時的な単体テストで使用したランダム コードです。

内容は合法だと思いfakeByteDataます。

ここで誰かが光を当てることができますか?

4

4 に答える 4

3

これはbase64文字列ですが、画像が含まれていません

base64でデコードした後にデータをディスクにダンプすると、0xffまでのバイト0x00、0x01、0x02などであることがわかります。

編集:質問のコメントに対処するには:これは画像を表していないという点で「悪い」データです。このような場合の単体テストが必要になる場合がありますが、有効なイメージを表していないデータに基づいて実際のイメージを期待する単体テストを作成することはできません。

実生活でどのように画像データを取得しますか?Base-64でエンコードされた文字列になりますか?もしそうなら、データURIスキームのウィキペディアエントリから取られた、赤いスポットの有効なデータのサンプルを次に示します。

string fakeByteData = 
    "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";
于 2009-04-06T06:43:56.350 に答える
3

Base64でエンコードされfakeByteDataていませんか?これは通常、画像(バイナリ)データを文字列として保存する方法です...

==文字列の末尾にある" " は、Base64 エンコーディングでも使用されるパディング文字のように見えます。

試してみるとどうなりますか:

Stream stream = new MemoryStream(Convert.FromBase64String(fakeByteData));

更新:オンライン デコーダー/エンコーダーfakeByteDataを使用してデコードを試みましたが、画像を読み込めませんでした。コンテンツを表示すると、非常に偽のデータのように見えます。

�<br> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡‡‰Š‹ŒŽ ''“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿

これは確かに、私が知っているようなイメージを生成するべきではありません。バイト 00 ~ FF の連続した配列のように見えます。あなたの問題はデータにあると思います。

于 2009-04-06T05:37:08.820 に答える
0

ビットマップデータは実際のビットマップですか?ストリームからビットマップを作成するには、ストリームに通常ビットマップファイルに含まれているデータが含まれている必要があります。これには、ヘッダーなどが含まれます。

バイトデータがファイル全体ではなく実際の画像を提供することを目的としている場合は、最初に、必要なサイズと画像形式で新しいビットマップを作成する必要があります。次に、BitMap.LockBitsを使用してビットマップをロックし、Marshal.Copyを使用してバイトデータをビットマップデータにコピーする必要があります。または、Bitmap.SetPixelを使用してバイト配列を手動でトラバースすることもできますが、それははるかに遅くなります。

于 2009-04-06T06:39:14.210 に答える
0
string fakeByteData = "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";

Stream stream = new MemoryStream(Convert.FromBase64String(fakeByteData));

これは、画像を取得するための単体テストに役立ちました

于 2013-03-13T18:45:14.033 に答える