Xcode
iOS
CoreImage
Swift
iOS9

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が左右上下に拡大するような計算式だと思いますので、自前で出力結果のサイズを調整するのも手かもしれません...)

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