2013-11-27 80 views
1

我想将字符串转换为位图或我可以在pixelbox中显示的东西。将字符串转换为位图c#

我的字符串如下所示:

string rxstring = "010010010020020020030030030040040040050050050060060060070070070080080080090090090100100100110110110120120120130130130140140140150150150160160160“ 

这是没有问题的删除字符串中的RGB代码

("01002003004005060070080090100110120130140150160"); 

我只需要它来显示的并不重要[原文]

IDE:VS2010 C#

+1

如何获取图像的字符串数据? –

+0

我通过我的Arduino串行COM端口读取它 –

+0

这是一个Base64字符串吗? –

回答

1

经连续审查,我意识到,你得到的字符串不一个字节ar射线。这将创建一个方形位图,并让您逐个像素地设置值。

List<string> splitBytes = new List<string>(); 
string byteString = ""; 
foreach (var chr in rsstring) 
     { 
      byteString += chr; 

      if (byteString.Length == 3) 
      { 
       splitBytes.Add(byteString); 
       byteString = ""; 
      } 
     } 

     var pixelCount = splitBytes.Count/3; 
     var numRows = pixelCount/4; 
     var numCols = pixelCount/4; 

     System.Drawing.Bitmap map = new System.Drawing.Bitmap(numRows, numCols); 

     var curPixel = 0; 
     for (int y = 0; y < numCols; y++) 
     { 
      for (int x = 0; x < numRows; x++) 
      { 
       map.SetPixel(x, y, System.Drawing.Color.FromArgb(
        Convert.ToInt32(splitBytes[curPixel * 3]), 
        Convert.ToInt32(splitBytes[curPixel * 3 + 1]), 
        Convert.ToInt32(splitBytes[curPixel * 3 + 2]))); 

       curPixel++; 
      } 
     } 
     //Do something with image 

编辑:对行/列迭代进行更正以匹配上面显示的图像。

+0

这里假设你发送的图像总是一个正方形,并且将它视为这样 –

+0

谢谢这段代码在我的刺激中没有任何错误 –

+0

请注意,图像变得越大,越复杂,代码执行的时间就越长。 –

1

尝试串转换为一个字节数组,并加载到一个内存流。一旦进入流,你应该能够转换为图像。

List<byte> splitBytes = new List<byte>();    
string byteString = ""; 

foreach (var chr in testString) 
{ 
    byteString += chr; 

    if (byteString.Length == 3) 
    { 
     splitBytes.Add(Convert.ToByte(byteString)); 
     byteString = ""; 
    } 
} 

if (byteString != "") 
    splitBytes.AddRange(Encoding.ASCII.GetBytes(byteString)); 

using (var ms = new MemoryStream(splitBytes.ToArray())) 
{ 
    var img = System.Drawing.Image.FromStream(ms); 

    //do something with image. 
} 

编辑:添加更新的代码。这是通过加载我自己的图像并将字节转换为字符串,然后使用上述代码将它们转换回字节数组来测试的,并且我成功从字符串加载了图像。

string testString = "255216255224000016074070073070000001001001000096000096000000255225000104069120105102000000077077000042000000000008000004001026000005000000000001000000000062001027000005000000000001000000000070001040000003000000000001000002000000001049000002000000000018000000000078000000000000000000000096000000000001000000000096000000000001080097105110116046078069084032118051046053046049049000255219000067000002001001002001001002002002002002002002002003005003003003003003006004004003005007006007007007006007007008009011009008008010008007007010013010010011012012012012007009014015013012014011012012012255219000067001002002002003003003006003003006012008007008012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012012255192000017008000004000004003001034000002017001003017001255196000031000000001005001001001001001001000000000000000000000000001002003004005006007008009010011255196000181016000002001003003002004003005005004004000000001125001002003000004017005018033049065006019081097007034113020050129145161008035066177193021082209240036051098114130009010022023024025026037038039040041042052053054055056057058067068069070071072073074083084085086087088089090099100101102103104105106115116117118119120121122131132133134135136137138146147148149150151152153154162163164165166167168169170178179180181182183184185186194195196197198199200201202210211212213214215216217218225226227228229230231232233234241242243244245246247248249250255196000031001000003001001001001001001001001001000000000000000000001002003004005006007008009010011255196000181017000002001002004004003004007005004004000001002119000001002003017004005033049006018065081007097113019034050129008020066145161177193009035051082240021098114209010022036052225037241023024025026038039040041042053054055056057058067068069070071072073074083084085086087088089090099100101102103104105106115116117118119120121122130131132133134135136137138146147148149150151152153154162163164165166167168169170178179180181182183184185186194195196197198199200201202210211212213214215216217218226227228229230231232233234242243244245246247248249250255218000012003001000002017003017000063000252225248089251085248195193031007060033030133127054137107121166121143107103121116176043069052182202085076167111238224143056234193152252204073040162128063255217"; 

编辑:添加了用于测试上述代码的图像的示例字符串。

+0

这将工作,但仍然是用他的数据一个毫无意义的图像。 – woutervs

+1

从我所知道的情况来看,将图像字节数组转换为字符串是破坏数据的原因。理论上,上面的代码应该可以工作,但是在测试时,字符串本身在转换为字节数组时不是Image类可以加载的有效字节数组。 –

+0

如果你的字符串是一个字节数组的有效表示,它应该加载。 –

8

恐怕你得到的数据不是一个有意义的图像。如果你将数据分成三组。您会得到以下结果:

010 
010 
010 
020 
020 
020 
030 
030 
030 
040 
040 
040 
050 
050 
050 
060 
060 
060 
070 
070 
070 
080 
080 
080 
090 
090 
090 
100 
100 
100 
110 
110 
110 
120 
120 
120 
130 
130 
130 
140 
140 
140 
150 
150 
150 
160 
160 
160 

如果您查看该数据,则无法将其转换为实际上对我们意味着什么的图像。这将是一个48像素的集合。包含有点像图像梯度的(因为下面的数字遵循一个模式,是不断增加的。

我们需要更多的信息来调试这一点。(像什么组件提供数据等)

更新 这是我所得到的,当我将数据转换为像素(以帐户我已经扩大每个像素16×16)

Result when assembling the data

+0

也将上面的字符串转换为文本给你: (((222 << woutervs

+0

它是一个4×4像素女巫希望灰色显示在像素盒我知道你不会看到太多,但在一段时间会有更多的像素,然后我得到更好的热气球 –

+0

我已经更新了我的答案,数据结果的放大图像应该小16倍,因此不可见肉眼看不到你确定你的arduino发送了正确的数据吗 – woutervs