Core Image: объединить два CIImage Swift

Итак, у меня есть 2 CIImage, которые я хочу объединить, поэтому каждый с альфа-каналом 0,5. Как мне это сделать?

Я устал от следующего кода, но результирующее изображение имеет неправильный размер, и два изображения не связаны правильно... Пожалуйста, помогите!

if let image = CIImage(contentsOf: imageURL) {
    let randomFilter = CIFilter(name: "CIRandomGenerator")
    let noiseImage = randomFilter!.outputImage!.cropped(to: (CGRect(x: CGFloat(Int.random(in: 1..<1000)), y: CGFloat(Int.random(in: 1..<1000)), width: image.extent.width, height: image.extent.height)))
    let compoimg = noiseImage.composited(over: image) //Misaligned image

} 

смещенное изображение


person Jerry Xu    schedule 19.03.2019    source источник
comment
Проверьте stackoverflow.com /вопросы/31996715/   -  person Onur Tuna    schedule 19.03.2019
comment
Я сделал то же самое. Это не работает. Пожалуйста, предоставьте мне быстрые примеры   -  person Jerry Xu    schedule 19.03.2019
comment
На основе сообщения здесь medium.com/@ranleung/uiimage-vs -ciimage-vs-cgimage-3db9d8b83d94 Я думаю, вам следует использовать UIImage вместо CIImage, чтобы избежать неправильного выравнивания.   -  person Onur Tuna    schedule 19.03.2019


Ответы (1)


Проблема заключается в генераторе случайного шума, поскольку случайный шум обрезается из бесконечной карты шума... правильный код компенсирует этот перевод:

if let image = CIImage(contentsOf: imageURL) {
    let randomFilter = CIFilter(name: "CIRandomGenerator")
    let randX = CGFloat(Int.random(in: 0..<1000))
    let randY = CGFloat(Int.random(in: 0..<1000))
    let noiseImage = randomFilter!.outputImage!.cropped(to: (CGRect(x: randX, y: randY, width: image.extent.width, height: image.extent.height)))
    let tt = noiseImage.transformed(by: CGAffineTransform.init(translationX: -randX, y: -randY))
    let compoimg = tt.composited(over: image) //Correctly allied image
}
person Jerry Xu    schedule 19.03.2019
comment
Вы перемещаете начало экстента шумового изображения на случайное смещение (вот почему произошло указанное выше смещение), а затем вы перемещаете начало координат обратно в ноль с помощью преобразования перевода. Я почти уверен, что вы могли бы просто использовать .cropped(to: image.extent). - person Frank Schlegel; 19.03.2019
comment
Я мог бы. Однако шум не был бы случайным, если бы обрезка всегда происходила в одном и том же месте. - person Jerry Xu; 20.03.2019
comment
Ах хорошо. Значит, при каждом вызове используется одно и то же семя? - person Frank Schlegel; 20.03.2019