缩放 CIImage 并将其平移到可绘制的中心

问题描述 投票:0回答:1

我有以下代码将输入

CIImage
缩放为
MTKView
中的可绘制大小,并在调整纵横比后将其居中。但图像位置并不总是适合所有长宽比,不知道为什么。特别是对于方形图像,我得到 (1080, 1080) 和 (2160,2160) 图像的不同位置,这两个图像都不居中。我做错了什么?

  func drawCIImage(_ ciImage:CIImage?) {
    guard let image = ciImage,
        let currentDrawable = currentDrawable,
        let commandBuffer = commandQueue?.makeCommandBuffer()
        else {
            return
    }

    let drawableSize = self.drawableSize
    
    let adjustedDrawableSize = AVMakeRect(aspectRatio: CGSize(width: image.extent.width, height: image.extent.height), insideRect: CGRect(x: 0, y: 0, width: drawableSize.width, height: drawableSize.height)).size
    
    let scaleX = adjustedDrawableSize.width / image.extent.width
    let scaleY = adjustedDrawableSize.height / image.extent.height
    
    NSLog("Adjusted size \(adjustedDrawableSize), \(drawableSize), \(image.extent), \(scaleX), \(scaleY)")
    
    let scaledImage = image.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY).translatedBy(x: (drawableSize.width - adjustedDrawableSize.width)/2, y: (drawableSize.height - adjustedDrawableSize.height)/2)).composited(over: CIImage.red.clampedToExtent())
    
    let destination = CIRenderDestination(width: Int(drawableSize.width),
                                          height: Int(drawableSize.height),
                                          pixelFormat: self.colorPixelFormat,
                                          commandBuffer: commandBuffer,
                                          mtlTextureProvider: { () -> MTLTexture in
                                             return currentDrawable.texture
    })
    
    destination.colorSpace = metalLayer.colorspace
    
    _ = try? context.startTask(toRender: scaledImage, to: destination)
    
    commandBuffer.present(currentDrawable)
    commandBuffer.commit()
}

编辑:以下代码有效,不确定有什么区别:

 var scaledImage = image.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleY))
 scaledImage = scaledImage.transformed(by: CGAffineTransform(translationX: (drawableSize.width - adjustedDrawableSize.width)/2, y: (drawableSize.height - adjustedDrawableSize.height)/2))
 scaledImage = scaledImage.composited(over: CIImage.black.clampedToExtent())
ios core-image cifilter ciimage mtkview
1个回答
0
投票

在未经编辑的代码中,您在缩放

translatedBy
上调用了
CGAffineTransform
,它将两个操作连接成一个变换(通过矩阵乘法)。在这种情况下,翻译需要基于原始图像尺寸,而不是缩放后的尺寸。

依次执行这两个操作会更容易,就像您在编辑的代码中所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.