Изменить размер CIImage до точного размера - PullRequest
0 голосов
/ 04 мая 2020

Я ищу способ изменить размер CIImage до точного размера, так как я использую смешивание CIFilter и мне нужно, чтобы оба смешанных CIImage s были одинакового размера. Мне нужно использовать CIFilter, чтобы изменить размер изображения, так как это было бы дешевле для меня с точки зрения памяти, и я не могу использовать Core Graphics et c.

Я знаю, что есть CILanczosScaleTransform фильтр доступен, но он не позволяет изменять размер для точного размера, только уменьшать или увеличивать.

Есть ли способ сделать CIImage точным размером, используя только Core Image

1 Ответ

3 голосов
/ 04 мая 2020

CILanczosScaleTransform имеет два параметра:

  • scale: коэффициент масштабирования, используемый на изображении
  • aspectRatio: дополнительный коэффициент горизонтального масштабирования для использования на изображении

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

import CoreImage

let context = CIContext()
let imageURL = URL(fileURLWithPath: "sample.jpg")
let sourceImage = CIImage(contentsOf: imageURL, options: nil)
let resizeFilter = CIFilter(name:"CILanczosScaleTransform")!

// Desired output size
let targetSize = NSSize(width:190, height:230)

// Compute scale and corrective aspect ratio
let scale = targetSize.height / (sourceImage?.extent.height)!
let aspectRatio = targetSize.width/((sourceImage?.extent.width)! * scale)

// Apply resizing
resizeFilter.setValue(sourceImage, forKey: kCIInputImageKey)
resizeFilter.setValue(scale, forKey: kCIInputScaleKey)
resizeFilter.setValue(aspectRatio, forKey: kCIInputAspectRatioKey)
let outputImage = resizeFilter.outputImage

Мое примерное изображение имело размеры (w 2,048 h 1,536). Расчетный коэффициент масштабирования составил 0,1497395833333333, а соотношение сторон 0,6195652173913043, что дает целевые выходные размеры (w 190 h 230).

.
...