Если вы помещаете вещи в цикл, будьте осторожны, используя что-то похожее на двоичный поиск, вместо того, чтобы просто увеличивать / уменьшать параметр качества на фиксированную величину, пока не будет достигнут желаемый размер.
РЕДАКТИРОВАТЬ:Немного объяснив бинарный поиск.Возьмите гипотетический случай изображения, которое сжимается до quality*10000
байтов, поэтому оптимальным параметром качества будет 30. Теперь наивным подходом будет попытка установить фиксированный параметр качества (например, 80, который даст 800 000 байтов), а затем уменьшить его наопределенное количество до 300000 байт.Если вы хотите снизить качество изображения на 5 на каждом шаге, попробуйте 12 настроек качества этим методом, пока не найдете нужную настройку. бинарный поиск даст результат быстрее, например:
Quality Size Next step
80 800000 Too big, so quality := quality/2
40 400000 Too big, so quality := quality/2
20 200000 Too small, so quality := (40+20)/2
30 300000 Reached desired size
Это дает результат только после 4 попыток (или 3 в зависимости от того, что 200000 байт слишком мало или для вас просто отлично)).Поскольку размер не имеет линейного отношения к качеству, этот пример немного нереалистичен, но бинарный поиск все же должен давать вам лучшие результаты, чем наивный подход.
Вы также можете использовать некоторые типичные изображения для «обучения»,Закодируйте их, используя различные настройки качества (например, 100,90, ..., 20,10) и посмотрите, насколько они велики по сравнению с их исходным размером.Это может дать хорошую первую оценку в большинстве случаев, хотя вам все равно придется корректировать при обнаружении изображений с гораздо более или менее подробной информацией в них.
В качестве альтернативы, посмотрите на кодировщики JPEG2000, у которых есть возможность установитьразмер файла вместо качества.
РЕДАКТИРОВАТЬ: Я не знаю библиотек кодирования JPEG2000 для C #, кажется, только плавающие вокруг декодеры, так что это может быть сложнее, чем я думал вначале.Вы можете попробовать CSJ2K , но описание не похоже на то, что оно готово к использованию.