12

我正在尝试将 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;
    }
4

5 回答 5

8

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

byte[]-> String->byte[]是一种转换,它不适用于许多给定的字节序列。您必须始终使用 byte[] 。

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

码位 U+D800 到 U+DFFF[编辑] Unicode 标准为前导和尾随代理的 UTF-16 编码永久保留这些码位值,并且永远不会为它们分配字符,因此应该没有理由进行编码他们。官方 Unicode 标准规定所有 UTF 形式,包括 UTF-16,都不能对这些代码点进行编码。

于 2013-06-27T16:11:01.177 回答
5

希望这可以帮助您:

public Bitmap stringToImage(string inputString)
{
   byte[] imageBytes = Encoding.Unicode.GetBytes(inputString);
   using (MemoryStream ms = new MemoryStream(imageBytes))
   {
       return new Bitmap(ms);
   }
}
于 2013-06-27T16:21:10.400 回答
3

取出写入 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;
}
于 2013-06-27T16:10:01.663 回答
2

您从 ldap 获取图像作为字符串?我很确定这是不是真的,字符串实际上是 base64 编码的,在这种情况下包含代表实际字符的字节,而不是图像数据。

你能发布你得到的字符串的片段吗?

如果是真的,您需要通过 un-base64'ing 来获取字符串并将其转换为 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;
}
于 2013-06-27T21:51:48.053 回答
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;
     }
于 2013-06-27T16:50:58.703 回答