3

所以几天前我在这里问了这个关于从 android.graphics.Bitmap 对象生成 md5 总和的问题。用户 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 脚本看起来像这样:

def begin(path):
    os.chdir(path)
    files = glob.glob("*")

    for file in files:
        processFile(file, path)

def processFile(file, folder):
    with open(file, "r") as picture:
        fileContents = picture.read()
        md5 = hashlib.md5()
        md5.update(fileContents)
        hash = md5.hexdigest()
        print file + "   :   " + hash

Android 应用程序从服务器接收一个 json 字符串,其中包含图像的 url 和 md5 总和。md5 的总和是事先用 python 脚本计算出来的。下载图像后,我留下了一个 Bitmap 对象,然后我在应用程序中使用该对象。

Leonidos 建议 Bitmap 对象的处理方式与 python 处理图像数据的方式不同,我需要在 Android 中找到原始图像数据的 md5 和。这听起来,对我来说,是一个完全合理的解释。只是当谈到这一切时,我真的很迷茫。

那么正确的方法是什么?

4

1 回答 1

1

好吧,这只是一个有根据的猜测,但对我来说似乎很明显,如果您想获得与未压缩文件相同的 MD5 哈希值,则不应使用 JPEG 压缩位图。

您可能做的最简单的事情是使用copyPixelsToBuffer并调整您的 python 代码以仅读取实际像素并忽略标题等。使用 PIL 很容易。

位图类在内部可能实际上只是一个未压缩的像素缓冲区,因此您甚至无法从中获取原始文件内容。只要位图类和 PIL 以相同的方式解压缩原始文件(这似乎很可能),使用哈希的实际像素值就可以避免问题。

于 2013-03-04T20:45:38.663 回答