Обрезка изображения JPEG без повторной выборки - PullRequest
0 голосов
/ 09 июня 2019

Моему приложению необходимо прочитать файл JPEG с диска, обрезать его до известного региона и сохранить его под другим именем.Моя текущая реализация выглядит примерно так:

// open and crop the image
let image = CIImage(contentsOf: imagePath)
let cropRect = CGRect(x: 100, y: 100, width: 100, height: 100)
let croppedImage = image.cropped(to: cropRect)

// write to disk
let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)
let context = CIContext()
context.writeJPEGRepresentation(of: croppedImage, to: destination, colorSpace: colorSpace, options: [kCGImageDestinationLossyCompressionQuality as CIImageRepresentationOption: 1])

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

Есть ли способ просто обрезать уже сжатый файл JPEG без увеличения размера файла или изменения какого-либодругих его характеристик?

1 Ответ

1 голос
/ 10 июня 2019

Ваш подход выглядит правильно. Из-за природы сжатия JPEG вы не можете «просто обрезать» изображение без декодирования и перекодирования в процессе.

Большой размер файла зависит от выбранного вами качества сжатия. Чтобы процитировать документы:

Значение 1.0 указывает на использование сжатия без потерь, если формат назначения поддерживает его […]

Изображения JPEG с качеством 1.0 часто больше, чем PNG-эквивалент. По моему опыту значения от 0,7 до 0,85 дают хорошее соотношение качества к размеру.

...