Ios 对UIImage进行像素化将返回不同大小的UIImage

Ios 对UIImage进行像素化将返回不同大小的UIImage,ios,swift,uiimage,core-image,Ios,Swift,Uiimage,Core Image,我正在使用扩展对图像进行像素化,如下所示: func pixellated(scale: Int = 8) -> UIImage? { guard let ciImage = CIImage(image: self), let filter = CIFilter(name: "CIPixellate") else { return nil } filter.setValue(ciImage, forKey: kCIInputImageKey) filter.setV

我正在使用扩展对图像进行像素化,如下所示:

func pixellated(scale: Int = 8) -> UIImage? {
    guard let ciImage = CIImage(image: self), let filter = CIFilter(name: "CIPixellate") else { return nil }
    filter.setValue(ciImage, forKey: kCIInputImageKey)
    filter.setValue(scale, forKey: kCIInputScaleKey)

    guard let output = filter.outputImage else { return nil }

    return UIImage(ciImage: output)
}
func pixellated(scale: Int = 8) -> UIImage? {
    guard let ciImage = CIImage(image: self), let filter = CIFilter(name: "CIPixellate") else { return nil }

    print("UIIMAGE : \(self.size)")
    print("ciImage.extent.size : \(ciImage.extent.size)")

    filter.setValue(ciImage, forKey: kCIInputImageKey)
    filter.setValue(scale, forKey: kCIInputScaleKey)

    guard let output = filter.outputImage else { return nil }

    print("output : \(output.extent.size)")

    return UIImage(ciImage: output)
}
问题是这里self表示的图像的大小与我使用UIImageciImage:output创建的图像的大小不同

例如,使用该代码:

print("image.size BEFORE : \(image.size)")
if let imagePixellated = image.pixellated(scale: 48) {
    image = imagePixellated
    print("image.size AFTER : \(image.size)")
}
将打印:

image.size BEFORE : (400.0, 298.0)
image.size AFTER : (848.0, 644.0)
大小和比例不一样

知道为什么吗

编辑:

我在扩展中添加了一些打印,如下所示:

func pixellated(scale: Int = 8) -> UIImage? {
    guard let ciImage = CIImage(image: self), let filter = CIFilter(name: "CIPixellate") else { return nil }
    filter.setValue(ciImage, forKey: kCIInputImageKey)
    filter.setValue(scale, forKey: kCIInputScaleKey)

    guard let output = filter.outputImage else { return nil }

    return UIImage(ciImage: output)
}
func pixellated(scale: Int = 8) -> UIImage? {
    guard let ciImage = CIImage(image: self), let filter = CIFilter(name: "CIPixellate") else { return nil }

    print("UIIMAGE : \(self.size)")
    print("ciImage.extent.size : \(ciImage.extent.size)")

    filter.setValue(ciImage, forKey: kCIInputImageKey)
    filter.setValue(scale, forKey: kCIInputScaleKey)

    guard let output = filter.outputImage else { return nil }

    print("output : \(output.extent.size)")

    return UIImage(ciImage: output)
}
以下是输出:

UIIMAGE : (250.0, 166.5)
ciImage.extent.size : (500.0, 333.0)
output : (548.0, 381.0)
你有两个问题:

自我尺寸以点为单位测量。self的像素大小实际上是self.size乘以self.scale。 Cipixellae过滤器更改其图像的边界。 要解决问题1,只需将返回的UIImage的scale属性设置为与self.scale相同:

但你会发现这仍然不太正确。那是因为问题二。对于问题二,最简单的解决方案是裁剪输出图像:

这将为您提供所需大小的图像


现在,你的下一个问题可能是,为什么在我的像素化图像周围有一个薄而暗的边界?好问题!但要问一个新问题。

ciImage在创建之后的范围是多少?我怀疑问题可能与赛尔夫的体重有关。@ravron我更新了问题,并在扩展部分添加了一些指纹。一开始看起来像一个刻度是的,但不明白为什么输出是这样的比率不是sameThanks Ravron。很好。不过,我还没有看到你所说的黑暗边界。