首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >像素化UIImage返回具有不同大小的UIImage

像素化UIImage返回具有不同大小的UIImage
EN

Stack Overflow用户
提问于 2017-05-22 03:58:15
回答 1查看 251关注 0票数 0

我使用一个扩展来对我的图像进行像素化,如下所示:

代码语言:javascript
复制
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)
}

问题是,这里由self表示的图像的大小与我使用UIImage(ciImage: output)创建的图像大小不一样。

例如,使用该代码:

代码语言:javascript
复制
print("image.size BEFORE : \(image.size)")
if let imagePixellated = image.pixellated(scale: 48) {
    image = imagePixellated
    print("image.size AFTER : \(image.size)")
}

将印刷:

代码语言:javascript
复制
image.size BEFORE : (400.0, 298.0)
image.size AFTER : (848.0, 644.0)

大小不一样,比例也不一样。

知道为什么吗?

编辑:

我在扩展部分中添加了一些打印内容如下:

代码语言:javascript
复制
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)
}

以下是产出:

代码语言:javascript
复制
UIIMAGE : (250.0, 166.5)
ciImage.extent.size : (500.0, 333.0)
output : (548.0, 381.0)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 23:07:15

你有两个问题:

  1. self.size是以点为单位的。self的大小(以像素为单位)实际上是self.size乘以self.scale
  2. CIPixellate过滤器更改其图像的边界。

要修复第一个问题,只需将返回的UIImageUIImage属性设置为与self.scale相同

代码语言:javascript
复制
return UIImage(ciImage: output, scale: self.scale, orientation: imageOrientation)

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

代码语言:javascript
复制
// Must use self.scale, to disambiguate from the scale parameter
let floatScale = CGFloat(self.scale)
let pixelSize = CGSize(width: size.width * floatScale, height: size.height * floatScale)
let cropRect = CGRect(origin: CGPoint.zero, size: pixelSize)
guard let output = filter.outputImage?.cropping(to: cropRect) else { return nil }

这会给你一个你想要的大小的图像。

现在,你的下一个问题可能是,“为什么我的像素图像周围有一条又薄又暗的边框?”问得好!但要问一个新的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44104448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档