#cocoa #core-graphics
#cocoa #core-graphics
Вопрос:
Я успешно использую CGImageSource для чтения изображения (в основном в формате JPEG) и CGImageDestination для его обратной записи. Это работает, но мое изображение получается намного меньше, чем было раньше (изображение размером 3,9 Мб станет изображением размером 2,1 Мб).
Я играл с kCGImageDestinationLossyCompressionQuality, и хотя это влияет на размер файла, я не понимаю, какой масштаб он использует.
Например, тот же файл размером 3,7 Мб изменит свой размер на:
-
1,9 Мб при качестве сжатия 0,7
-
2,4 Мб с качеством сжатия 0,8
-
3,0 Мб с качеством сжатия 0,9
-
7,4 Мб с качеством сжатия 1,0
Я перепробовал все (перейдя к 6 десятичным знакам, используя дихотомию), чтобы найти подходящее место, чтобы вернуться к этим волшебным 3,9 Мб, но оно увеличивается с 3,3 Мб до 7,4 Мб, и, по-видимому, нет способа заставить его оставаться между этими 2 числами.
Есть ли какая-либо другая библиотека Objective-C, которую я могу использовать для изменения данных EXIF, которая оставляет сжатие (и, следовательно, размер файла) в покое?
Ответ №1:
Используя CGImageDestination, вы создаете новое изображение, и очень сложно, чтобы размер вновь созданного изображения соответствовал исходному. (зависит от уровня сжатия).
Если вам нужно просто изменить метаданные в исходном изображении, не изменяя информацию об изображении, вам следует использовать другую библиотеку. Я знаю два из них, которые можно использовать в приложении cocoa:
- библиотека libexif C . Поддерживает запись JPG. Лицензия LGPL.
- exiv2 C . Поддерживает запись во множество форматов. Но для этого требуется платная лицензия, если вы используете ее в коммерческом приложении.
Другой вариант — использовать exiftool. Это скрипты perl, которые стали стандартом де-факто для изменения информации метаданных. Вы могли бы включить его в папку ресурсов вашего приложения и вызвать его с помощью NSTask для изменения метаданных изображений. Довольно легко сделать и, безусловно, лучший инструмент из трех. (Только для Mac, не уверен, что вы ориентируетесь на iphone или Mac)