Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 图像裁剪/将UIImage转换为CGImage/线程1时出错:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)_Swift_Image_Uiimage_Crop_Cgimage - Fatal编程技术网

Swift 图像裁剪/将UIImage转换为CGImage/线程1时出错:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)

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

我对编程有点陌生,我正在尝试捕获一个屏幕截图,然后将其裁剪到特定区域。 我能想出下面的代码,但它给了我线程1:EXC_BAD_指令代码=EXC_I386_INVOP,子代码=0x0 error,通常不会告诉你太多。我试着分离代码的片段,看看错误来自哪里,它看起来像是从CIImage到CGImage的转换

我已经尝试过直接从UIImage转到CGImage,但是我得到了相同的错误

这是调用裁剪函数的屏幕截图捕获代码

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方法从一个转换到另一个。谢谢你为我指明了正确的方向。我找到了解决方案,贴在下面。