Ошибка при обрезке изображения / преобразование UIImage в CGImage / поток 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0) - PullRequest
0 голосов
/ 18 июня 2020

Я немного новичок в программировании, и я пытаюсь сделать снимок экрана, а затем обрезать его до определенной области c. Я смог придумать приведенный ниже код, но он дает мне ошибку Thread 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0), которая обычно мало что вам говорит. Я попытался выделить фрагменты кода, чтобы увидеть, откуда исходит ошибка, и похоже, что это от преобразования CIImage в CGImage.

Я уже пробовал перейти от UIImage к CGImage напрямую, но получаю то же самое ошибка.

Это код захвата снимка экрана, который вызывает функцию кадрирования.

UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0.0)
view.layer.render(in: UIGraphicsGetCurrentContext()!)

let itemToShare = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

cropImage(itemToShare)  

Это функция кадрирования. .Cropping (to: закомментирован, потому что я хотел убедиться, что ошибка возникла не из-за урожая. ответы в стеке или на форумах разработчиков Apple ведут одинаково.

Daniel

1 Ответ

1 голос
/ 18 июня 2020

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

Итак, пара строк решила это.

Сначала UIImage преобразуется в CIImage с помощью

let ciImage = CIImage(image: screenshot)

, затем CIImage преобразуется в CGImage с context

let context = CIContext(options: nil)
let cgImage = context.createCGImage(ciImage!, from: ciImage!.extent)

теперь cgImage можно обрезать с помощью

let crop = CGRect(x: 0,
                  y: 0,
                  width: 200,
                  height: 200)
let cropedImage = cgImage!.cropping(to: crop)

и, наконец, полученный обрезанный CGImage можно превратить в UIImage и вернуть функцией

return UIImage(cgImage: cropedImage!)

По-видимому, вы не можете go из UIImage прямо в CGImage.

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

...