NSImage/CGImage slice extension error: CGImageCreateWithImageProvider: invalid image size: 0 x 0
NSImage/CGImage slice extension error: CGImageCreateWithImageProvider: invalid image size: 0 x 0
我在 NSImage
、cgImageSlice
的扩展中有一个方法,它应该 return [CGImage]
包含每个图像切片。当 运行 代码时,我在第 18 行的第一个循环后得到错误 CGImageCreateWithImageProvider: invalid image size: 0 x 0
,但是 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
}
}
我通过将 rect 移到 for 循环之外设法解决了这个问题。我不太确定为什么会修复它,但确实如此!
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] {
guard let cgImage = self.cgImage else {
return []
}
let sliceSize = { () -> CGSize in
size == nil ? self.sliceSize(axis: axis, slices: slices) : size!
}()
var cgImages = [CGImage]()
var rect = CGRect(origin: .zero, size: sliceSize)
for i in 1 ... slices {
if let cropped = cgImage.cropping(to: rect) {
cgImages.append(cropped)
}
rect.origin = CGPoint(x: 0, y: sliceSize.height * CGFloat(i))
}
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
、cgImageSlice
的扩展中有一个方法,它应该 return [CGImage]
包含每个图像切片。当 运行 代码时,我在第 18 行的第一个循环后得到错误 CGImageCreateWithImageProvider: invalid image size: 0 x 0
,但是 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
}
}
我通过将 rect 移到 for 循环之外设法解决了这个问题。我不太确定为什么会修复它,但确实如此!
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] {
guard let cgImage = self.cgImage else {
return []
}
let sliceSize = { () -> CGSize in
size == nil ? self.sliceSize(axis: axis, slices: slices) : size!
}()
var cgImages = [CGImage]()
var rect = CGRect(origin: .zero, size: sliceSize)
for i in 1 ... slices {
if let cropped = cgImage.cropping(to: rect) {
cgImages.append(cropped)
}
rect.origin = CGPoint(x: 0, y: sliceSize.height * CGFloat(i))
}
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
}
}