2013-03-04 1 views
3

Итак, несколько дней назад я спросил this question здесь о SO о генерации суммы md5 из объекта android.graphics.Bitmap. Пользователь Леонидос оказал большую помощь, и его предложенный метод работает. Но сумма md5, которую я создал заранее, используя ту же картинку, дает другую сумму.Создание суммы md5 в python для изображения, которое затем проверяется в приложении для 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; 
} 

Хотя сценарий питона выглядит следующим образом:

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 

Андроида приложение получает строку JSON с сервера, содержит URL-адрес изображения и сумму md5. Сумма md5 была рассчитана заранее с помощью скрипта python. После того, как изображение было загружено, мне остается объект Bitmap, который затем я использую в приложении.

Leonidos предположил, что объект Bitmap не обрабатывается так же, как python обрабатывает данные изображения, и мне нужно будет найти сумму md5 необработанных данных изображения в Android. Этот звук для меня был вполне правдоподобным объяснением. Просто я действительно потеряюсь, когда дело доходит до всего этого.

Итак, каков правильный способ сделать это?

+0

Создает ли растровое изображение как файл? если это так, я могу опубликовать фрагмент java и python, который я использовал для получения md5 файла изображения, и он работает для меня (оба возвращают одинаковое значение для того же файла). Шахта начинается с пути к файлу, хотя, если вы получаете растровое изображение без файла, это не будет полезно. – FoamyGuy

+0

Вероятно, вы должны открыть файл в режиме «rb», а не «r» в сценарии Python. B означает, что это двоичный файл. –

+0

Я сохраняю каждый битмап на телефоне, поэтому я мог бы загрузить его как java.io.File сразу после его сохранения. Я надеялся, что мне не придется это делать. Но если у вас есть фрагмент кода, который работает, и у меня нет другого решения, я бы это сделал. Поэтому, пожалуйста, непременно, если это не хлопот, отправьте свой фрагмент :) – Bjorninn

ответ

1

Ну, это всего лишь образованное предположение и все, но мне кажется очевидным, что вам не нужно сжимать растровое изображение с использованием JPEG, если вы хотите получить тот же MD5-хеш, что и несжатый файл.

Проще всего, что вы, вероятно, можете сделать, это использовать copyPixelsToBuffer и адаптировать свой код на Python, чтобы читать только фактические пиксели и игнорировать заголовок и т. Д. Достаточно легко использовать PIL.

Класс битмапа внутри, по-видимому, действительно является не чем иным, как несжатым пиксельным буфером, поэтому вы даже не можете получить исходное содержимое файла из него. Использование фактических значений пикселей для хеша позволяет избежать проблемы вместе, пока оба класса растрового изображения и PIL разархивируют исходный файл одинаково (что кажется вероятным).

+0

Я рассмотрю эти методы. Мне нужно что-то закончить, прежде чем я смогу вернуться к этому. После этого я опубликую свои выводы. – Bjorninn

Смежные вопросы