Posted at

CIGaussianBlur(CoreImage)の出力サイズがiOS9で変わった

More than 3 years have passed since last update.

CIGaussianBlurでぼかした結果の画像サイズがiOS8以前とiOS9で変わったように見えます。


検証コード


  • Xcode 6.4 (SDK 8.4) + Swift


ViewController.swift

import UIKit

func blur(orgImage: UIImage, radius: CGFloat) -> UIImage {
let filteredImage = CIImage(CGImage: orgImage.CGImage)
let blurFilter = CIFilter(name: "CIGaussianBlur")
blurFilter.setDefaults()
blurFilter.setValue(filteredImage, forKey: kCIInputImageKey)
blurFilter.setValue(radius, forKey: "InputRadius")
return UIImage(CIImage: blurFilter.outputImage)!
}

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let orgImage = UIImage(named: "Test")!
let blurImage = blur(orgImage, 3)
println("\(orgImage.size) -> \(blurImage.size)")
view.addSubview(UIImageView(image: blurImage))
}
}


※Retinaを考慮しないものとしています。


検証結果

iOS8

(48.0, 48.0) -> (66.0, 66.0)

iOS9 + iPad Air

(48.0, 48.0) -> (80.0, 80.0)

iOS9の方が余白が多く確保されるようになったようです。


何が困るか

ぼやかした画像をアニメーションで拡大縮小するときに、framesizeに固定値を入れてしまうと、iOS8以前と9とで見た目の画像サイズが変わってしまいます。アニメーション後のsizeではなく倍率を固定値にすることで回避しました。

(iOS8以前はたぶんblur値 * 3が左右上下に拡大するような計算式だと思いますので、自前で出力結果のサイズを調整するのも手かもしれません...)

何故このような改変が有ったんでしょうね。