3

それで、数日前、私はandroid.graphics.Bitmapオブジェクトからmd5合計を生成することについてSOでこの質問をしました。ユーザー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アプリは、画像へのURLとmd5の合計を含むjson文字列をサーバーから受け取ります。md5の合計は、事前にpythonスクリプトを使用して計算されています。画像がダウンロードされた後、アプリで使用するBitmapオブジェクトが残ります。

Leonidosは、BitmapオブジェクトはPythonが画像データを処理するのと同じように処理されないこと、そしてAndroidで生の画像データのmd5合計を見つける必要があることを示唆しました。この音は、私にとって、完全にもっともらしい説明であると思います。これらすべてに関して、私は本当に本当に迷っています。

では、これを行う正しい方法は何ですか?

4

1 に答える 1

1

これは経験に基づいた推測にすぎませんが、圧縮されていないファイルと同じ MD5 ハッシュを取得したい場合は、JPEG を使用してビットマップを圧縮すべきではないことは明らかです。

おそらく最も簡単な方法は、copyPixelsToBufferを使用して、実際のピクセルのみを読み取り、ヘッダーなどを無視するように Python コードを調整することです。PIL を使えば簡単です。

ビットマップ クラスは内部的には圧縮されていないピクセル バッファーに他ならないため、そこから元のファイルの内容を取得することさえできません。ハッシュに実際のピクセル値を使用すると、ビットマップ クラスと PIL の両方が元のファイルを同じように解凍する限り、問題をすべて回避できます (これは可能性が高いと思われます)。

于 2013-03-04T20:45:38.663 に答える