我在做了一些画布和绘画操作之后创建了一个位图,然后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);
答案 0 :(得分:4)
即使字体完全相同,提示(字符字形和线条)也将取决于底层硬件和浏览器。
这是HTML canvas的众所周知的特征。
如果您希望能够在2个不同的设备上生成完全相同的图像,那么您需要使用自己的图元处理uint数组以绘制/自己的字体处理程序。
答案 1 :(得分:2)
目前尚不清楚第二个代码段中的位图对象来自何处,因此可能会有大量的解释。
虽然,我的猜测是位图在某个时刻被转换为设备像素,这可以解释为什么你会在不同的设备上获得不同的结果,具体取决于屏幕尺寸和分辨率。
这不太可能是Base64编码方法的问题,您可以通过比较字节数组来验证。