4

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

2 回答 2

4

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

这是HTML 画布的一个众所周知的特性。

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

于 2018-01-18T17:21:33.997 回答
2

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

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

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

于 2018-01-19T12:09:41.527 回答