作者:cocoa_小米多本_148 | 来源:互联网 | 2023-09-01 12:53
在C#中从字符串转换为Image我试图将Unicode字符串转换为C#中的图像。每次我运行它都会在这一行上出错ImageimageImage.FromStream(ms,true,
在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);
然后当你将这个字符串传递给你的方法时……
上述就是C#学习教程:在C#中从字符串转换为Image分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记
public Image stringToImage(string inputString) { byte[] NewBytes = Convert.FromBase64String(inputString); MemoryStream ms1 = new MemoryStream(NewBytes); Image NewImage = Image.FromStream(ms1); return NewImage; }