2012-06-20 6 views
4

Я хочу вычислить хэш SHA1 разных растровых изображений (SHA не принудительно). Проблема в том, что есть некоторые растровые изображения (captchas), которые в основном одинаковы, но имя часто меняется.Android-хеш растрового изображения

Я нашел это:

Compute SHA256 Hash in Android/Java and C#

Но это не soloution я хотел.

Bitmap.hashCode(), создает только целое число, а когда им право

Возвращает целое хэш-код для этого объекта. По контракту любые два объекта, для которых equals (Object) возвращает true, должны возвращать одинаковое значение хеш-кода. Это означает, что подклассы Object обычно переопределяют оба метода или ни один из методов.

Я не хочу хеш-код объекта, я хочу хэш-код растрового содержимого. Thanx!

+0

Ваш вопрос очень запутан: вы ожидаете, что два растровых изображения с одним и тем же «Картинком внутри» и разными именами приведут к тому же хэшу? Почему то, что вы уже нашли, не подходит для вас? Да Bitmaps.hashCode() возвращает целое число, что с ним не так (если SHA не принудительно)? Пожалуйста, перефразируйте свой вопрос, если вы хотите получить полноценный ответ. –

+0

Я читаю разные растровые изображения (captchas) от разбора веб-сайта, часто одни и те же картинки с разными именами. Может быть, я пропустил ошибку Bitmap.hashCode(), он генерирует хэш для объекта, а не для контента Bitmap? // отредактированный вопрос – MemLeak

ответ

1

Вы могли бы попытаться написать свою собственную функцию, используя только пиксель из Bitmap:

public long hashBitmap(Bitmap bmp){ 
    long hash = 31 //or a higher prime at your choice 
    for(int x = 0; x < bmp.getWidth(); x++){ 
    for (int y = 0; y < bmp.getHeight(); y++){ 
     hash *= (bmp.getPixel(x,y) + 31); 
    } 
    } 
    return hash; 
} 

, если его только о сравнении двух изображений вы могли бы оптимизировать эту процедуру для хеширования только каждый второй или x pixel

4

В Android 3.1 или более поздней версии (уровень API 12) существует метод на Bitmap под названием sameAs(), который будет сравнивать пиксели и возвращать, если они представляют одно и то же изображение. Он делает это в собственном коде, поэтому он относительно быстр.

Если вы должны ориентироваться на более низкий уровень API, вы должны написать метод, который выполняет итерацию по каждому пикселю двух объектов и видит, совпадают ли они. Это будет очень интенсивный процесс, если это сделано в Java-коде, поэтому вы можете рассмотреть возможность написания небольшой подпрограммы с помощью NDK, которую вы можете вызывать из своего приложения, чтобы выполнить сравнение в собственном коде (в NDK есть API-интерфейсы Bitmap, чтобы вы могли легко получить в пиксельных буферах).

Если вы решите сделать это на Java, getPixels() поможет вам получить массивы данных пикселей, которые вы можете сравнить между двумя изображениями.

НТН

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