Swift 图像裁剪/将UIImage转换为CGImage/线程1时出错:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)
我对编程有点陌生,我正在尝试捕获一个屏幕截图,然后将其裁剪到特定区域。 我能想出下面的代码,但它给了我线程1:EXC_BAD_指令代码=EXC_I386_INVOP,子代码=0x0 error,通常不会告诉你太多。我试着分离代码的片段,看看错误来自哪里,它看起来像是从CIImage到CGImage的转换 我已经尝试过直接从UIImage转到CGImage,但是我得到了相同的错误 这是调用裁剪函数的屏幕截图捕获代码Swift 图像裁剪/将UIImage转换为CGImage/线程1时出错:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0),swift,image,uiimage,crop,cgimage,Swift,Image,Uiimage,Crop,Cgimage,我对编程有点陌生,我正在尝试捕获一个屏幕截图,然后将其裁剪到特定区域。 我能想出下面的代码,但它给了我线程1:EXC_BAD_指令代码=EXC_I386_INVOP,子代码=0x0 error,通常不会告诉你太多。我试着分离代码的片段,看看错误来自哪里,它看起来像是从CIImage到CGImage的转换 我已经尝试过直接从UIImage转到CGImage,但是我得到了相同的错误 这是调用裁剪函数的屏幕截图捕获代码 UIGraphicsBeginImageContextWithOptions(vi
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, 0.0)
view.layer.render(in: UIGraphicsGetCurrentContext()!)
let itemToShare = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
cropImage(itemToShare)
这是裁剪功能。.cropingto:被注释掉,因为我想确保错误不是来自裁剪
func cropImage(_ screenshot: UIImage) -> CGImage {
let ciImage = CIImage(image: screenshot)
let crop = CGRect(x: 0,
y: 0,
width: 50,
height: 50)
let cgImage = (ciImage as! CGImage) //.cropping(to: crop)!
return cgImage
}
我感谢所有的帮助,因为我已经研究这几天了,stack或Apple dev论坛上的所有答案都以同样的方式给出
Daniel好的,经过进一步研究,我发现错误在于试图创建一个没有上下文的CGImage 所以,几行就解决了这个问题 首先,UIImage被转换为具有
let ciImage = CIImage(image: screenshot)
然后,CIImage被转换为具有上下文的CGImage
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!)
显然你不能直接从UIImage转到CGImage
注意大小和比例,一个使用点作为参考,其他像素。。。因此,您需要进行一些数学计算,以获得所需的精确裁剪位置。如果您在调试构建时查看控制台,您应该会在类似“无法将CIImage类型的值强制转换为CGImage”的消息中获得更多信息。事实上,你不能将CIImage转换成CGImage,因为它们是不相关的类型。您正在寻找类似于我尝试了create方法,但收到一条消息说它已被“弃用”,并且Xcode建议降级。另外,尝试从UIImage到CGImage,并得到相同的错误。我将试着看看控制台,看看它说了些什么。我对CI API不太熟悉,但总的来说还是正确的。CIImage和CGImage是不相关的类型,您不能在它们之间强制转换,就像您不能将字符串转换为一样!Int。你需要使用某种CoreImage或CoreGraphics方法从一个转换到另一个。谢谢你为我指明了正确的方向。我找到了解决方案,贴在下面。