0

我已将一张图像转换为 base64 字符串,并且输出与在线网站相同。

但是当我从 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);
            }

安卓代码

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

base 64 有很多变体,涉及行长、填充、校验和等。关于 Base64 的维基百科文章有一个很好的变体表。

我的猜测是 C# 和 Android 只是使用不同的变体。

编辑根据您更新的帖子,还有其他几种可能性:

  • Android 可能会在将 .jpg 文件打包为资源时对其进行修改(然而,虽然资源打包器在压缩方面非常激进,但可能并非如此);
  • Android 可能会以不同于原始图像的方式重新编码图像(两个 .jpg 文件可以表示相同的像素值,而不是逐字节相同)

更好的测试是跳过(在 Android 代码中)从资源到 aBitmap并返回到 .jpg 编码的转换。只需将资源作为流打开,直接将其读入字节数组,然后以 base 64 编码。

于 2013-02-08T05:45:42.600 回答