Почему пиксели jpeg-изображения различны в другой библиотеке изображений? [Дубликат]

public static Boolean Add_Tag(int totalsize)
{ List<String> fullst = new ArrayList<String>();
            for(int k=0;k<totalsize;k++)
            {
              fullst.addAll();
            }
}
18
задан rhashimoto 17 May 2014 в 19:03
поделиться

5 ответов

Стандарт JPEG не требует, чтобы реализации декодера воспроизводили идентичные выходные изображения бит-бит. К сожалению, стандартный документ, определяющий требования декодера, ISO 10918-2 , по-видимому, не доступен онлайн, но Wikipedia говорит :

... стандарт JPEG (и аналогичные стандарты MPEG) включает в себя некоторые требования к точности декодирования, включая все части процесса декодирования (декодирование с переменной длиной, обратный DCT, деквантование, перенормировка выходов); выход из эталонного алгоритма не должен превышать:

  • максимум 1 бит разницы для каждого компонента пикселя
  • низкая среднеквадратическая ошибка по каждому блоку размером 8 × 8 пикселей
  • [и т. д.]

Различия между различными выходами декодера с использованием одного и того же входа обычно связаны с разными уровнями внутренней точности, особенно при выполнении IDCT. Другой возможный источник различий - это сглаживание, которое пытается уменьшить артефакты «блокировки».

Как и вы, я ожидал бы, что параметр inPreferQualityOverSpeed будет выдавать тот же результат, но ничего на самом деле этого не гарантирует. Я могу подумать, по крайней мере, о нескольких способах, которыми вы могли бы получить небольшие вариации на двух разных телефонах:

  1. На телефонах могут работать разные версии Android, где изменилась реализация BitmapFactory (например, возможно inPreferQualityOverSpeed был сломан, а затем зафиксирован или наоборот) или
  2. Телефоны могут предоставлять различные аппаратные функции (например, набор векторных инструкций, сопроцессор DSP и т. д.), которые используют BitmapFactory. Даже различия в скалярных единицах с плавающей запятой могут вызывать расхождения, особенно с компиляцией JIT, производящей фактические машинные инструкции.

Учитывая пространство для маневра в стандарте плюс ваши экспериментальные наблюдения, это единственный способ для обеспечения согласования бит-бит для выполнения декодирования в вашем собственном приложении. Возможно, вы найдете другую альтернативную Android-совместимую библиотеку.

14
ответ дан rhashimoto 28 August 2018 в 23:34
поделиться

Да, значения цвета пикселей различны для разных устройств. Это очень раздражает, особенно если вы хотите сравнить цвета. Решение состоит в том, чтобы сравнить визуально равные цвета (по человеческому восприятию).

. Один из лучших методов сравнения двух цветов с помощью человеческого восприятия - 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);

1
ответ дан Ivo Stoyanov 28 August 2018 в 23:34
поделиться

Измените размер носителя до требуемого размера или используйте атрибуты HTML, чтобы отключить масштабирование изображения.

Другим вариантом было бы позволить пользователю решить после загрузки представления эскизов для экономии полосы пропускания.

0
ответ дан Jay 28 August 2018 в 23:34
поделиться

Предположим, вы также должны проверить, отображаются ли сжатые PNG одинаково на всех устройствах.

http://pngquant.org/

Если ответ да, то остальное останется только выяснить, как конвертировать программно телефона эти изображения для того же самого сжатого png.

2
ответ дан Stephan Branczyk 28 August 2018 в 23:34
поделиться

Большая часть работы декодера JPEG включает вычисления реальных чисел. Обычно это делается с использованием целочисленной арифметики фиксированной точки для производительности. Это приводит к ошибкам округления. Небольшие вариации - естественная часть работы с JPEG.

1
ответ дан user3344003 28 August 2018 в 23:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: