我有一个扩展NSImage, cgImageSlice,它应该返回[CGImage]包含每个图像切片。在运行代码时,我会得到错误信息。CGImageCreateWithImageProvider: invalid image size: 0 x 0但是,在第18行的第一个循环之后,RECT的大小就不是这样了。这是为什么?
extension NSImage {
var cgImage: CGImage? {
var proposedRect = CGRect(origin: .zero, size: size)
return cgImage(forProposedRect: &proposedRect, context: nil, hints: nil)
}
func sliceSize(axis: Axis, slices: Int) -> CGSize {
CGSize(width: axis == .horizontal ? size.width : size.width / CGFloat(slices), height: axis == .vertical ? size.height : size.height / CGFloat(slices))
}
func cgImageSlice(axis: Axis, slices: Int, sliceSize size: CGSize? = nil) -> [CGImage] {
let sliceSize = { () -> CGSize in
size == nil ? self.sliceSize(axis: axis, slices: slices) : size!
}()
var cgImages = [CGImage]()
for i in 0 ..< slices {
let rect = CGRect(x: CGFloat(i) * sliceSize.width, y: CGFloat(i) * sliceSize.height, width: sliceSize.width, height: sliceSize.height)
if let cgImage = cgImage?.cropping(to: rect) {
cgImages.append(cgImage)
}
}
return cgImages
}
func nsImageSlice(axis: Axis, slices: Int) -> [NSImage] {
let sliceSize = self.sliceSize(axis: axis, slices: slices)
var images = [NSImage]()
for cgImage in cgImageSlice(axis: axis, slices: slices, sliceSize: sliceSize) {
images.append(NSImage(cgImage: cgImage, size: sliceSize))
}
return images
}
enum Axis {
case horizontal
case vertical
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您遇到的问题可能与如何处理NSImage
的内部结构和数据有关,特别是当尝试将其转换为CGImage
切片时。错误信息表明在尝试创建CGImage
时,遇到了无效的图像尺寸(0x0),这意味着系统期望一个有具体宽度和高度的矩形区域,但实际上得到了一个空尺寸。
根据您的描述,问题可能出在以下几个方面:
图像数据未正确加载或初始化:确保在调用cgImageSlice
扩展之前,NSImage
对象已经完全加载了其图像数据。有时候,图像数据可能还没有准备好,特别是在异步加载场景下。
Rect参数处理问题:在您的代码中提到的第18行之后RECT
的大小变化,这暗示了在循环过程中对CGRect
的修改可能没有正确反映到cgImageForProposedRect:
方法的调用中。请检查是否正确传递了预期的矩形区域尺寸给该方法。
内存管理问题:在处理大量图像数据或切片时,务必注意内存管理。如果在处理过程中出现了内存泄漏或其他内存相关问题,可能会间接导致图像数据无法正确读取。
API使用不当:确认cgImage(forProposedRect:)
方法的使用是否符合Apple的文档说明。有时候,即使代码编译通过,不恰当的参数传递也可能导致运行时错误。
针对这些问题,您可以尝试以下解决步骤:
验证图像加载状态:在进行任何图像处理之前,确保NSImage
实例已完全加载。可以考虑使用代理方法或监听加载完成事件来确保这一点。
仔细检查循环逻辑:确保在每次循环迭代中,用于创建CGImage
的CGRect
都是有效且非零尺寸的。可能需要在循环体内打印出每次迭代的矩形尺寸,以帮助诊断问题。
内存管理审查:使用Xcode的内存分析工具检测是否有内存泄露,尤其是在处理大量图像数据时。
查阅官方文档:再次检查cgImage(forProposedRect:)
的官方文档,确认参数的具体要求和使用限制,确保按照推荐的方式使用API。
如果以上建议不能解决问题,提供具体的代码片段(尤其是第18行及周边相关的代码)将有助于更精确地定位问题所在。