public static Boolean Add_Tag(int totalsize)
{ List<String> fullst = new ArrayList<String>();
for(int k=0;k<totalsize;k++)
{
fullst.addAll();
}
}
Стандарт JPEG не требует, чтобы реализации декодера воспроизводили идентичные выходные изображения бит-бит. К сожалению, стандартный документ, определяющий требования декодера, ISO 10918-2 , по-видимому, не доступен онлайн, но Wikipedia говорит :
... стандарт JPEG (и аналогичные стандарты MPEG) включает в себя некоторые требования к точности декодирования, включая все части процесса декодирования (декодирование с переменной длиной, обратный DCT, деквантование, перенормировка выходов); выход из эталонного алгоритма не должен превышать:
blockquote>
- максимум 1 бит разницы для каждого компонента пикселя
- низкая среднеквадратическая ошибка по каждому блоку размером 8 × 8 пикселей
- [и т. д.]
Различия между различными выходами декодера с использованием одного и того же входа обычно связаны с разными уровнями внутренней точности, особенно при выполнении IDCT. Другой возможный источник различий - это сглаживание, которое пытается уменьшить артефакты «блокировки».
Как и вы, я ожидал бы, что параметр
inPreferQualityOverSpeed
будет выдавать тот же результат, но ничего на самом деле этого не гарантирует. Я могу подумать, по крайней мере, о нескольких способах, которыми вы могли бы получить небольшие вариации на двух разных телефонах:
- На телефонах могут работать разные версии Android, где изменилась реализация
BitmapFactory
(например, возможноinPreferQualityOverSpeed
был сломан, а затем зафиксирован или наоборот) или- Телефоны могут предоставлять различные аппаратные функции (например, набор векторных инструкций, сопроцессор DSP и т. д.), которые используют
BitmapFactory
. Даже различия в скалярных единицах с плавающей запятой могут вызывать расхождения, особенно с компиляцией JIT, производящей фактические машинные инструкции.Учитывая пространство для маневра в стандарте плюс ваши экспериментальные наблюдения, это единственный способ для обеспечения согласования бит-бит для выполнения декодирования в вашем собственном приложении. Возможно, вы найдете другую альтернативную Android-совместимую библиотеку.
Да, значения цвета пикселей различны для разных устройств. Это очень раздражает, особенно если вы хотите сравнить цвета. Решение состоит в том, чтобы сравнить визуально равные цвета (по человеческому восприятию).
. Один из лучших методов сравнения двух цветов с помощью человеческого восприятия - CIE76. Разница называется Delta-E. Когда он меньше 1, человеческий глаз не может распознать разницу.
Вы можете найти класс замечательных цветных утилит ( ColorUtils ), который включает методы сравнения CIE76.
Из ColorUtils.class я использую метод:
static double colorDifference(int r1, int g1, int b1, int r2, int g2, int b2)
r1, g1, b1 - значения RGB первого цвета
r2, g2, b2 - значения RGB второго цвета, которые вы хотели бы сравнить
. Если вы работаете с Android, вы можете получить следующие значения:
r1 = Color.red(pixel);
g1 = Color.green(pixel);
b1 = Color.blue(pixel);
Измените размер носителя до требуемого размера или используйте атрибуты HTML, чтобы отключить масштабирование изображения.
Другим вариантом было бы позволить пользователю решить после загрузки представления эскизов для экономии полосы пропускания.
Предположим, вы также должны проверить, отображаются ли сжатые PNG одинаково на всех устройствах.
Если ответ да, то остальное останется только выяснить, как конвертировать программно телефона эти изображения для того же самого сжатого png.
Большая часть работы декодера JPEG включает вычисления реальных чисел. Обычно это делается с использованием целочисленной арифметики фиксированной точки для производительности. Это приводит к ошибкам округления. Небольшие вариации - естественная часть работы с JPEG.