将某些字节数据读入Bitmap时出现问题

时间:2009-04-06 05:34:16

标签: .net image bitmap stream

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

  

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 个答案:

答案 0 :(得分:3)

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

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

尝试时会发生什么:

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

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

  


  !“#$%&安培;'()* +, - / 0123456789:;?< => @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^ _`ABCDEFGHIJKLMNOPQRSTUVWXYZ {|}〜€,ƒ“...†‡‰ŠœžŸ   ¡¢£¤¥|§¨©ª«¬®¯°±²³'μ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

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

答案 1 :(得分:3)

这是一个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==";

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

这帮助我进行单元测试以获得图像