所以几天前,我问this question这里关于从android.graphics.Bitmap对象。用户Leonidos是一个很大的帮助,他建议的方法有效。但是我之前用同一张图片生成的md5求和给出了一个不同的和。在
我使用的Android代码如下: 在
public String md5ForBitmap(Bitmap bitmap)
{
String hash = "";
try
{
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] bitmapBytes = stream.toByteArray();
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(bitmapBytes);
byte[] digestedBytes = messageDigest.digest();
BigInteger intRep = new BigInteger(1, digestedBytes);
hash = intRep.toString(16);
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return hash;
}
python脚本如下所示: 在
^{pr2}$Android应用程序从服务器接收一个json字符串,该字符串包含指向图像的url和md5总和。md5和已经预先用python脚本计算过了。图像下载后,我只剩下一个位图对象,然后在应用程序中使用。在
Leonidos建议位图对象的处理方式与python处理图像数据的方式不同,我需要在Android中找到原始图像数据的md5和。对我来说,这是一个非常合理的解释。只是我真的很迷惘当这一切发生的时候。在
那么正确的方法是什么呢?在
好吧,这只是一个有根据的猜测,但对我来说很明显,如果你想获得与未压缩文件相同的MD5哈希值,就不应该使用JPEG压缩位图。在
{你也可以使用python}来调整你的代码。使用PIL很容易。在
bitmap类在内部可能只是一个未压缩的像素缓冲区,因此您甚至无法从中获取原始文件内容。使用哈希的实际像素值可以避免所有问题,只要bitmap类和PIL都以相同的方式解压缩原始文件(这似乎很有可能)。在
相关问题 更多 >
编程相关推荐