我有一个大的 Tilesheet(一张图片中有超过 1000 个图 block ),如下所示:
每个图 block 都是 64x64,我想拆分图片。在这个例子中,我将 4 个瓷砖放在一个数组中。我怎样才能做到这一点?有不同的尺寸?我需要一些魔法(数学)或更好的想法,我怎样才能在循环中获得正确的裁剪位置。
一些快速编码的代码:
func cropImage(image: UIImage, tileSize: Int) -> [UIImage]? {
if Int(image.size.height) % 64 != 0 && Int(image.size.width) % 64 != 0 {
return nil
}
let hCount = Int(image.size.height) / tileSize
let wCount = Int(image.size.width) / tileSize
var tiles:[UIImage] = []
for i in 0...hCount {
for p in 0...wCount {
let temp:CGImage = image.cgImage!.cropping(to: CGRect.zero)!
tiles.append(UIImage(cgImage: temp))
}
}
return tiles
}
最佳答案
在每次通过循环时,您需要两条信息:
图 block 的大小是多少?这对所有瓷砖都是一样的;你只需要在循环之前计算一次。
磁贴的来源是什么?这对于每个图 block 都是不同的。您将循环遍历 x 计数和 y 计数,在最内层的循环中,您将根据图 block 大小计算这个图 block (即这个 x 和 y)的原点你已经知道了。
现在您知道要用于此 拼贴的原始图像的确切矩形。剩下的就很简单了。
但是,我建议考虑一下裁剪到该矩形的实际方式。您建议通过调用 CGImage 的 cropping(to:)
进行裁剪。但是,在类似的情况下,这不是我所做的。我通过将原始 UIImage 在所需原点的负值绘制到所需大小的图像图形上下文中来制作 UIImage。
关于swift - 将图片拆分为图 block 并放入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076184/