是否有任何库能够根据需要将图像数据编码为ASTC纹理? 我知道它是CPU密集型的,但无论如何都感兴趣。
答案 0 :(得分:3)
在iOS 10中,Apple将ASTC编码添加到系统中。您可以通过/usr/include/AppleTextureEncoder.h,/usr/lib/libate.dylib或(更简单)访问它,只需使用通过CG / ImageIO.framework提供的常用图像编码工具编码到ASTC。请参阅CGImageDestination和关联的对象。也可以通过Xcode中的图像资产目录压缩来实现它。
系统ASTC编码器比ARM参考编码器快得多。支持块大小4x4和8x8。性能应类似于JPEG或PNG编码。
答案 1 :(得分:3)
import ImageIO
import MetalKit
let loader: MTKTextureLoader
let srcImage: CGImage
let ktxData = NSMutableData()
let dest = CGImageDestinationCreateWithData(ktxData, "org.khronos.ktx" as CFString, 1, nil)!
CGImageDestinationAddImage(dest, srcImage, 0, ["kCGImagePropertyASTCBlockSize": 0x88] as CFDictionary)
CGImageDestinationFinalize(dest)
try loader.newTexture(data: ktxData as Data, options: [])
显示的kCGImagePropertyASTCBlockSize
选项可以获得8x8块大小(即每像素2位);唯一允许的其他大小是4x4(每像素8位),这是默认值。
要获得最佳效果,请将kCGImageDestinationLossyCompressionQuality: 0.0
添加到CGImageDestinationAddImageFromSource
。
其他可能的标志是kCGImagePropertyASTCUseLZFSE
,kCGImagePropertyASTCPreTwiddle
,kCGImagePropertyASTCFlipVertically
和kCGImagePropertyASTCWeightChannelsEqually
(所有bool)。
答案 2 :(得分:1)
https://github.com/ARM-software/astc-encoder是参考压缩器(由ARM和AMD创建)。在iOS设备上使用源代码可能并不困难。它可能过于缓慢,但它确实提供了各种速度选项,因此可能会为您在质量和速度之间取得适当的平衡。