2016-12-28 5 views
0

Я сейчас работаю над небольшим приложением Server-Client с сервером, находящимся на компьютере и клиентом на устройстве Android. В какой-то момент я хочу, чтобы устройство проверяло, имеет ли изображение, которое оно имеет в актуальном состоянии, и использует как можно меньше данных, поэтому я написал код для создания контрольной суммы для изображения, которое должно облегчить для клиента определение является ли это pic актуальным или нет.
(я собирался отправить код, но это было довольно давно, так что я буду стараться без первого) В псевдокоде:ImageIO.read() и BitmapFactory.decodeByteArray()

long getCheckSumFor(Image i) { 
    long xVal; 
    long yVal; 
    count x from 0 to i.width 
     long val = 0; 
     count y from 0 to i.height 
      val += i.getPixel(x, y); 
     yVal += val % Integer.MAX_VALUE; 
    count y from 0 to i.height 
     long val = 0; 
     count x from 0 to i.width 
      val += i.getPixel(x, y); 
     xVal += val % Integer.MAX_VALUE; 
    int tx = xVal % Integer.MAX_VALUE; 
    int ty = yVal % Integer.MAX_VALUE; 
    return a long with the first 4 bytes taken from ty and the last 4 bytes taken from tx 
} 

это в основном, как это работает, но это дает разные выходы для одних и тех же исходных данных (в зависимости от платформы, ПК или Android).
Я использую ImageIO.read() на ПК и BitmapFactory.decodeByteArray() (без BitmapFactory.Options), чтобы прочитать изображение и отладки, показал, что yVal уже отличается от платформы к платформе, поэтому я предполагаю, что могут быть небольшие различия в том, как каждый метод читает JPEG? И если это правда, есть ли способ, каким образом я мог бы читать их одинаково?

Спасибо заранее,
Sheldon

+1

Image.getPixel() на Android не существует. Так где ты говоришь? И почему вы говорите или используете BitmapFactory? Сначала вы не сделаете растровое изображение? Я думаю, ваш сервер будет служить файлу изображения. Так что контрольные суммы над байтами над файлом изображения. Но какой смысл это сделать, чтобы сначала загрузить файл, а затем вычислить контрольную сумму? – greenapps

+0

Image.getPixel() также не существует на ПК, по крайней мере, не в java (это Pseudocode, поэтому API не используется) Я говорю о том, чтобы рассказать вам о методе, поэтому, если в нем есть какие-либо ошибки, легче выявить проблемы. BitmapFactory может читать JPEG, а также другие форматы изображений (насколько я слышал из Интернета, и он отлично декодируется, изображение выглядит правильно). Я когда-либо говорил, что я загружаю файл изображения раньше? Нет. Android и ПК используют один и тот же ввод, но из разных источников. – Sheldon

+0

Почему вы не реагируете на определение контрольной суммы над байтами файла изображения? В этом весь смысл. Не используйте для этого Bitmap и BitmapFactory. – greenapps

ответ

1

Не используйте Bitmap, BufferedImage or BitmapFactory!

Просто возьмите байты файла изображения, чтобы вычислить контрольную сумму.

Если вы отправляете файл, тогда отправляйте байты файла и не используйте какой-либо класс, который преобразует байты файла.

Не при отправке стороны. Не на приемной стороне.

+0

Да, это так, моя цель с этим вопросом заключалась в том, чтобы выяснить, почему ImageIO и BitmapFactory будут читать оба изображения по-разному – Sheldon

1

Что делать, если вы использовали MD5 вместо этого? Вы можете сделать это в Java here и для Android here

+0

Сколько байтов займет MD5? – Sheldon

+0

128 бит ... отлично, собираюсь попробовать – Sheldon