0

私は1つの画像をbase64文字列に変換し、その出力はオンラインWebサイトと同じです。

しかし、Androidから変換したときの同じ画像は異なります。

C# と Android の base64 文字列が同じ画像で異なる理由を説明してください。

C#.NET コード

string cImagePath = @"G:\bg-listing.png";
byte[] imagebyte = StreamFile(cImagePath);
String result = System.Convert.ToBase64String(imagebyte);
System.IO.StreamWriter outFile;
try
{
    outFile = new System.IO.StreamWriter(Application.StartupPath + "//image2base641.txt",
                                     false,
                                     System.Text.Encoding.Default);
                outFile.Write(result.ToString());
                outFile.Close();
            }
            catch (System.Exception exp)
            {
                // Error creating stream or writing to it.
                System.Console.WriteLine("{0}", exp.Message);
            }

Android コード

Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),  R.drawable.image);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
bitmapOrg.compress(Bitmap.CompressFormat.JPEG, 100, bao);
byte [] ba = bao.toByteArray();
 String ba1=Base64.encodeToString(ba,Base64.DEFAULT);

両方の画像base64は異なります。

私を助けてください。

4

1 に答える 1

3

Base64 には、行の長さ、パディング、チェックサムなどを含む多くのバリアントがあります。Base64 に関するウィキペディアの記事には、バリアントの優れた表があります。

私の推測では、C# と Android は単に異なるバリアントを使用しているだけです。

編集更新された投稿に基づいて、他にもいくつかの可能性があります。

  • Android は、リソースとしてパッケージ化するときに .jpg ファイルを変更している可能性があります (ただし、リソース パッケージャーは圧縮に関して非常に積極的ですが、おそらくそうではありません)。
  • Android は元の画像とは異なる方法で画像を再エンコードしている可能性があります (2 つの .jpg ファイルは同じピクセル値を表すことができ、バイトごとに同一ではありません)。

より良いテストは、(Android コードで) リソースからBitmap.jpg エンコーディングへの変換をスキップすることです。リソースをストリームとして開き、バイト配列に直接読み取り、それを base 64 でエンコードするだけです。

于 2013-02-08T05:45:42.600 に答える