我正在尝试将Unicode字符串转换为C#中的图像。每次我运行它都会在这一行上出现错误
Image image = Image.FromStream(ms, true, true);
说:ArgumentException未被用户代码处理。参数无效。任何想法为什么会这样?以下是该功能的其余部分。
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;
}
答案 0 :(得分:8)
Unicode不会对您需要表示图像的所有可能字节序列进行编码。
byte[]
- > String
- > byte[]
是一个转换,对于许多给定的字节序列都不起作用。你必须在整个过程中使用一个byte []。
例如,如果您读取字节,将它们转换为UTF-16,那么字节序列可能会被丢弃为无效。以下是来自UTF-16的无效字节序列的示例。
代码点U + D800到U + DFFF [编辑] Unicode标准永久 保留这些代码点值用于UTF-16编码的潜在客户和 跟踪代理人,他们永远不会被分配一个角色,所以 没有理由对它们进行编码。官方的Unicode 标准说所有UTF表格,包括UTF-16,都不能编码 这些代码点。
答案 1 :(得分:4)
这可以帮到你:
public Bitmap stringToImage(string inputString)
{
byte[] imageBytes = Encoding.Unicode.GetBytes(inputString);
using (MemoryStream ms = new MemoryStream(imageBytes))
{
return new Bitmap(ms);
}
}
答案 2 :(得分:1)
取出写入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;
}
答案 3 :(得分:1)
你是从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;
}
答案 4 :(得分:0)
使用字符串可能会丢失数据,我将发布将图像转换为字节数组并将数组再次转换为图像的示例,以及在图像到字节数组之后的字符串和返回,而不会丢失数据。
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;
}