Масштабирование вывода libjpeg
Позволяет ли libjpeg / есть процедуры для масштабирования выходного изображения?
У меня есть изображение, которое необходимо изменить при сохранении и загрузке, предоставляя width1, height1 на входе и получая width2, height2 на выходе, и я действительно не могу использовать что-либо снаружи.
2 ответа
Да, libjpeg поддерживает масштабирование изображения, но с некоторыми ограничениями.
Libjpeg версии 8c и выше поддерживает масштабирование M/8, где M - целое число от 1 до 16. Более широко используемая версия 6b libjpeg поддерживает только M с 1, 2, 4 и 8 (то есть, уменьшение масштаба степени 2).
Укажите масштабирующий числитель и знаменатель для объекта декомпрессии, используя scale_num и scale_denom. Смотрите jpeg_decompress_struct в jpeglib.h. Вы можете обратиться к djpeg.c для примера использования.
Это намного быстрее и потенциально более высокого качества, чем декодирование всего изображения и затем уменьшение масштаба.
Нет, вам нужно масштабировать его либо самостоятельно (линейная интерполяция является самой простой и быстрой, но дает квадратные пиксели, билинейные / трилинейные / бикубические - это трикеры, но дают более плавные результаты), либо с помощью библиотеки, которая сделает за вас грязную работу (проверьте OpenCV, SDL, imagemagick, libpipi и т. д.)
Подробнее об этом здесь, здесь.
Фактический код для простой интерполяции ближайшего соседа (неоптимизированный):
dest[dx+dy*dest_width] = src[(dx*src_width/dest_width)+(dy*src_height/dest_height)*src_width]
Просто итерируйте dx и dy в соответствии с dest_width и dest_height. Но на самом деле, используйте библиотеку для этого.