【问题标题】:Problem reading in some byte data into a Bitmap将某些字节数据读入位图时出现问题
【发布时间】:2010-10-17 17:56:38
【问题描述】:

我正在尝试将硬编码的位图图像读入位图对象。我不断收到同样的错误:

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 的内容是合法的。

这里有人能解释一下吗?

【问题讨论】:

  • 位图应该是什么格式?
  • 呃..不确定..我也不在乎。现在我只想为我的单元测试加载一些随机字节数据。如果我的样本数据是“坏的”,那么我对我的问题很满意,因为我总能找到一些新的“好”数据。因此,我试图了解错误真正是关于什么的。

标签: .net image bitmap stream


【解决方案1】:

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

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

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

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

string fakeByteData = 
    "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";

【讨论】:

  • 所以,我得到的错误基本上是说“base64 数据中没有 图像,所以繁荣!错误”?
  • 是的。您已要求它从该数据中加载图像(此时作为字节数组 - 它不知道它来自 base64)并且数据不包含图像,因此出现异常。
  • 感谢乔恩。我从跟踪您的答案中学到了很多东西(请注意,一切都很好)。你是整个编程社区的功劳。 /me 低头。再次感谢!
  • 没问题 - 很高兴它有帮助:)
【解决方案2】:

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

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

当你尝试时会发生什么:

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

更新:我尝试使用an online decoder/encoder 解码fakeByteData,但无法加载图像。查看内容时,看起来像是非常假的数据:


!"#$%&'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“” •–~™š›œžŸ ¡¢£¤¥¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìííîïïðñòóôõöÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏС

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

【讨论】:

  • var bitmap = new Bitmap(stream) 行。那里失败了。我的和你的。
  • @lc:这不仅仅是“非常虚假的数据”——它是非常可预测的数据:256 字节,00-FF。
【解决方案3】:

位图数据是实际位图吗?要从流创建位图,流必须包含通常包含在位图文件中的数据。这包括标题和那些东西。

如果字节数据旨在提供实际图像而不是整个文件,则应首先创建一个具有所需大小和所需图像格式的新位图。然后您应该使用 BitMap.LockBits 锁定位图并使用 Marshal.Copy 将字节数据复制到位图数据中。或者,您可以使用 Bitmap.SetPixel 并手动遍历字节数组,但这会慢得多。

【讨论】:

    【解决方案4】:
    string fakeByteData = "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
        + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
        + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
        + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
        + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
        + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";
    
    Stream stream = new MemoryStream(Convert.FromBase64String(fakeByteData));
    

    这有助于我进行单元测试以获取图像

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多