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

时间:2013-06-27 16:06:28

标签: c# string image

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

5 个答案:

答案 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;
     }