Ios 将MTLTexture保存并加载为PNG

Ios 将MTLTexture保存并加载为PNG,ios,swift,metal,metalkit,Ios,Swift,Metal,Metalkit,我试图将金属纹理保存并加载为PNG,但当我将其加载回时,它们看起来更模糊。我认为问题在于,转换一个800x600的纹理会创建一个1600x1200的PNG,因此我必须缩小PNG的比例,将其加载到正确大小的MTLTexture中 以下是我将纹理转换为PNG数据的代码: func textureToImage(纹理:MTLTexture)->数据{ 让kciOptions:[CIImageOption:Any]=[.colorSpace:CGColorSpaceCreateDeviceRGB()]

我试图将金属纹理保存并加载为PNG,但当我将其加载回时,它们看起来更模糊。我认为问题在于,转换一个800x600的纹理会创建一个1600x1200的PNG,因此我必须缩小PNG的比例,将其加载到正确大小的MTLTexture中

以下是我将纹理转换为PNG数据的代码:

func textureToImage(纹理:MTLTexture)->数据{
让kciOptions:[CIImageOption:Any]=[.colorSpace:CGColorSpaceCreateDeviceRGB()]
让ciImage=ciImage(mtlTexture:texture,options:kciOptions)!
let transform=CGAffineTransform.identity
.缩放比例(x:1,y:-1)
.translatedBy(x:0,y:ciImage.extent.height)
让transformed=ciImage.transformed(by:transform)
返回UIImage(ciImage:transformed).pngData()!
}
有关2x缩放问题的示例:

let纹理:MTLTexture=。。。
纹理宽度/=>800
让图像=纹理图像(纹理)
image.size.width/=>800
让数据=image.pngData()!
让我们重新加载eImage=UIImage(数据:数据)!
重新加载edimage.size.width/=>1600
因此,在将纹理转换为图像时,CIImage似乎将分辨率提高了一倍。以下是我将其转换回的代码,我认为缩小尺度会导致模糊:

func加载(image:UIImage)->MTLTexture{
//图像的分辨率是纹理分辨率的两倍,因此我们必须将其缩小
让缩放=缩放(图像:图像,缩放:0.5)
let选项:[MTKTextureLoader.Option:Any]=[
.SRGB:false,
.generateMipmaps:正确,
.textureUsage:MTLTextureUsage.unknown.rawValue
]
let loader=MTKTextureLoader(设备:Renderer.device)
let texture=try!loader.newTexture(cgImage:scaled,options:options)
返回纹理.makeTextureView(像素格式:.bgra8Unorm)!
}
func比例(图像:UIImage,比例:Float)->CGImage{
让比例=CGFloat(比例)
设newWidth=image.size.width*比例
设newHeight=image.size.height*比例
UIGraphicsBeginImageContext(CGSize(宽度:newWidth,高度:newHeight))
image.draw(in:CGRect(x:0,y:0,width:newWidth,height:newHeight))
让newImage=UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsSendImageContext()
返回newImage!.cgImage!
}

我有没有办法将UIImage加载回MTLTexture,而不必缩小它的比例?或者,有没有办法避免CIImage在转换为图像时将纹理的分辨率加倍?我需要将我的纹理存储为PNG,因为我有很多纹理,它们作为原始纹理数据占用了太多内存。

我在使用
UIImage.pngData
通过
CIImage
MTLTexture
保存到PNG时也遇到过这个问题。尽管中间
UIImage.scale
值为1,但我的PNG文件尺寸仍与屏幕比例相乘

在我的例子中,我通过简单地从循环中删除
CIImage
解决了这个问题。我现在直接从
MTLTexture
创建
CGImage
(使用类似的技术),然后从该
CGImage
创建
UIImage
,并调用
UIImage.pngData

我怀疑除了
scale
属性之外,还有某种
UIImage
元数据,
CIImage(mtlTexture:options:)
UIImage(CIImage:scale:orientation:)
设置不正确