在C#中从字符串转换为Image

我试图将Unicode字符串转换为C#中的图像。 每次我运行它都会在这一行上出错

Image image = Image.FromStream(ms, true, true); 

说:ArgumentException未被用户代码处理。 参数无效。 任何想法为什么会这样? 以下是该function的其余部分。

 public Image stringToImage(string inputString) { byte[] imageBytes = Encoding.Unicode.GetBytes(inputString); MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); ms.Write(imageBytes, 0, imageBytes.Length); Image image = Image.FromStream(ms, true, true); return image; } 

Unicode不会编码您需要表示图像的所有可能字节序列。

byte[] – > String – > byte[]是一个转换,它不适用于许多给定的字节序列。 你必须在整个过程中使用一个byte []。

例如,如果您读取字节,将它们转换为UTF-16,那么字节序列可能会被丢弃为无效。 以下是UTF-16中无效字节序列的示例。

代码点U + D800到U + DFFF [编辑] Unicode标准永久保留这些代码点值,用于引导和跟踪代理的UTF-16编码,并且它们永远不会被分配一个字符,所以没有理由编码他们。 官方的Unicode标准说所有UTF格式,包括UTF-16,都不能编码这些代码点。

愿这可以帮到你:

 public Bitmap stringToImage(string inputString) { byte[] imageBytes = Encoding.Unicode.GetBytes(inputString); MemoryStream ms = new MemoryStream(imageBytes); return new Bitmap(ms); } 

取出写入MemoryStream的调用。 接受字节数组的构造函数调用会自动将字节数组的内容放入流中。 否则,您的流包含2个原始数据副本。 此外,对Write的调用将使流的位置保留在流的末尾,因此没有FromStream调用可以读取的数据。

所以它会是:

 public Image stringToImage(string inputString) { byte[] imageBytes = Encoding.Unicode.GetBytes(inputString); // Don't need to use the constructor that takes the starting offset and length // as we're using the whole byte array. MemoryStream ms = new MemoryStream(imageBytes); Image image = Image.FromStream(ms, true, true); return image; } 

你是从ldap中获得一个字符串的图像吗? 我很确定如果这是真的,字符串实际上是base64编码的,在这种情况下包含代表实际字符的字节,而不是图像数据。

你能发一下你正在收到的字符串吗?

如果是真的,你需要取字符串并通过un-base64’将其转换为byte [],然后使用字节数组来制作图像。 结合@ JonBenedicto的代码:

 public Image stringToImage(string inputString) { byte[] imageBytes = Convert.FromBase64String(inputString); MemoryStream ms = new MemoryStream(imageBytes); Image image = Image.FromStream(ms, true, true); return image; } 

使用字符串,您可能会丢失数据,我将发布示例,将图像转换为字节数组,将数组再次转换为图像,并在图像到字节数组之后,进行字符串和返回,而不会丢失数据。

  MemoryStream ms = new MemoryStream(); Image.FromFile(@"C:\..\..\..\img.jpg").Save(ms,ImageFormat.Jpeg); byte[] bytes = ms.ToArray(); MemoryStream ms1 = new MemoryStream(bytes); Image NewImage = Image.FromStream(ms1); NewImage.Save(@"C:\..\..\..\img1.jpg"); 

试试这个,它可能会帮助你生产出你需要的东西。

尝试转换为字符串并返回,更好地使用base64。

  MemoryStream ms = new MemoryStream(); Image.FromFile(@"C:\..\..\..\img.jpg").Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg); byte[] bytes = ms.ToArray(); string byteString = Convert.ToBase64String(bytes); byte[] NewBytes = Convert.FromBase64String(byteString); MemoryStream ms1 = new MemoryStream(NewBytes); Image NewImage = Image.FromStream(ms1); 

这应该会给你你需要的结果。

  MemoryStream ms = new MemoryStream(); Image.FromFile(@"C:\..\..\..\img.jpg").Save(ms,ImageFormat.Jpeg); byte[] bytes = ms.ToArray(); string byteString = Convert.ToBase64String(bytes); 

然后当你将这个字符串传递给你的方法时……

  public Image stringToImage(string inputString) { byte[] NewBytes = Convert.FromBase64String(inputString); MemoryStream ms1 = new MemoryStream(NewBytes); Image NewImage = Image.FromStream(ms1); return NewImage; }