【发布时间】: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