在两个不同的Android设备上创建的Bitmaps Base64不完全相同

时间:2018-01-09 01:14:26

标签: android bitmap android-canvas android-paint

我在做了一些画布和绘画操作之后创建了一个位图,然后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);

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

目前尚不清楚第二个代码段中的位图对象来自何处,因此可能会有大量的解释。

虽然,我的猜测是位图在某个时刻被转换为设备像素,这可以解释为什么你会在不同的设备上获得不同的结果,具体取决于屏幕尺寸和分辨率。

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