12

C# で Unicode 文字列を画像に変換しようとしています。実行するたびに、この行でエラーが発生します

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 を含むすべての UTF 形式でこれらのコード ポイントをエンコードできないと規定されています。

于 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でエンコードされ、その場合、画像データではなく実際の文字を表すバイトが含まれていると確信しています。

取得している文字列のスニピットを投稿できますか?

true の場合は、文字列を取得し、base64 を解除してバイト [] に変換し、バイト配列を使用して画像を作成する必要があります。@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 に答える