【问题标题】:The Base64 of Bitmaps created on two different android devices is not identical在两个不同的 android 设备上创建的 Bitmap 的 Base64 不相同
【发布时间】:2018-06-18 00:25:04
【问题描述】:

我在做一些画布和绘画操作后创建了一个位图,然后 Base64 将其编码为一个字符串。当我在单独的设备上重复该过程并比较两个设备返回的 base64 编码字符串时,它们是不同的。关于为什么会这样的任何想法?

生成位图的代码 -

Bitmap bitmap = Bitmap.createBitmap(100, 100, Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.save();
canvas.rotate(45, midX, midY);
canvas.restore();
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(45);
paint.setTextAlign(Align.CENTER);
paint.setTextColor(Color.parseColor(colorString));
StaticLayout staticLayout = new StaticLayout("Text", paint, width,Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
staticLayout.draw(canvas);

将位图转换为 Base64 编码字符串的代码 -

    int size = bitmap.getRowBytes() * bitmap.getHeight();
    byte[] byteArray;

    ByteBuffer byteBuffer = ByteBuffer.allocate(size);
    bitmap.copyPixelsToBuffer(byteBuffer);
    byteArray = byteBuffer.array();

    String encodedString =  Base64.encodeToString(byteArray, Base64.NO_WRAP);

【问题讨论】:

  • 在两个设备上创建位图的方式是否完全相同?特别是,它们的大小(以像素为单位)和格式是否完全相同?
  • @clownba0t 是的,它在两个设备上运行相同的代码,所以它应该是相同的
  • 我唯一的其他建议是尝试将两个原始位图(即原始字节,不进行任何压缩)写入文件并进行十六进制差异(参见stackoverflow.com/a/16380175/2259854)以确定哪些部分的文件不同。
  • @clownba0t 我已经删除了压缩并将原始字节转换为 Base64 字符串。将尝试十六进制差异并让您知道。谢谢!
  • 您不能对位图进行 base64 编码。所以更好地告诉你你做了什么。或者更好地展示这样做的代码。

标签: android bitmap android-canvas android-paint


【解决方案1】:

即使字体完全相同,提示(字符字形和线条)也将取决于底层硬件和浏览器。

这是HTML canvas 的一个众所周知的特征。

如果您希望能够在 2 个不同的设备上生成完全相同的图像,那么您需要使用自己的原语绘制 uint 数组/您自己的字体处理程序。

【讨论】:

    【解决方案2】:

    不清楚第二个代码 sn-p 中的位图对象来自哪里,因此可能会有很多解释。

    不过,我的猜测是位图在某些时候会转换为设备像素,这可以解释为什么您在不同的设备上得到不同的结果,具体取决于屏幕尺寸和分辨率。

    这不太可能是 Base64 编码方法的问题,您可以通过比较字节数组来验证。

    【讨论】:

      猜你喜欢
      • 2018-01-11
      • 2020-11-24
      • 2016-03-01
      • 1970-01-01
      • 2013-09-16
      • 2013-05-08
      • 2013-09-19
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多