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

你确定fakeByteData不是Base64 编码的?这通常是将图像(二进制)数据存储为字符串的方式......

==字符串末尾的“ ”看起来也像 Base64 编码中使用的填充字符。

当您尝试时会发生什么:

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

更新:我尝试fakeByteData使用在线解码器/编码器进行解码,但无法加载图像。查看内容时,它看起来像非常假的数据:

�<br> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ ''“”•–∼™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÏÐÑÒÓÔÕÖ×øØýÙÚÛÜÝÞßà¦Ùûûüñòþÿõõõõõõõõ

这当然不应该产生任何我知道的图像;它似乎是字节 00-FF 的顺序数组。所以我认为你的问题出在数据上。

于 2009-04-06T05:37:08.820 回答
3

这是一个 base64 字符串,但其中没有图像。

如果你在 base64 解码后将数据转储到磁盘,你会发现它只是字节 0x00、0x01、0x02 等直到 0xff。

编辑:解决您在问题中的评论:这是“坏”数据,因为它不代表图像。您可能希望对这种情况进行单元测试,但您不能编写一个单元测试来期望基于不代表有效图像的数据的真实图像。

您将如何在现实生活中获取图像数据?它会是 base-64 编码的字符串吗?如果是这样,这里有一些红点的示例有效数据,取自数据 URI 方案的 Wikipedia 条目

string fakeByteData = 
    "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";
于 2009-04-06T06:43:56.350 回答
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 回答