その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

API Diffsから見るiOS 13の新機能 - Core Image #WWDC19

iOS 13の新API発掘シリーズその3です。今回はCore Image。

髪・肌・歯のマスク

iOS 12の"Portrait Matte"は全身セグメンテーション用のマスクだったわけですが、それの「髪・肌・歯」版が取れるようになったようです。

developer.apple.com

static let auxiliarySemanticSegmentationHairMatte: CIImageOption
static let auxiliarySemanticSegmentationSkinMatte: CIImageOption
static let auxiliarySemanticSegmentationTeethMatte: CIImageOption

関連: "Portrait Matte"とは?

shu223.hatenablog.com

デプスブラー

CIContextにデプスブラーフィルタを生成するメソッドが追加。disparityImage(視差画像)、portraitEffectsMatte(全身セグメンテーション用マスク画像)、hairSemanticSegmentation(髪のセグメンテーション画像)を渡せて、出力としてCIFilterオブジェクトが返ってきます。

developer.apple.com

func depthBlurEffectFilter(for image: CIImage, 
            disparityImage: CIImage, 
      portraitEffectsMatte: CIImage?, 
  hairSemanticSegmentation: CIImage?, 
               orientation: CGImagePropertyOrientation, 
                   options: [AnyHashable : Any]? = nil) -> CIFilter?

allowLowPower

また、CIContextOptionに以下の型プロパティが追加されていました。

static let allowLowPower: CIContextOption

ドキュメントには解説がありませんが、ヘッダになにか書いてあるかも知れません。パフォーマンスかなにかを犠牲にして消費電力を抑えるオプションでしょうか?

CIFilterの各フィルタの初期化メソッド

今までは次のように文字列でフィルタ名を指定して初期化しないといけなかったのですが、

let filter = CIFilter(name: "CISepiaTone")!

iOS 13ではドーンと(たぶん)全フィルタの初期化メソッドが追加されました。

一覧は長いので本記事の末尾に載せますが、たとえば上に示したsepia toneフィルタは次のメソッドで初期化できます。

class func sepiaTone() -> CIFilter & CISepiaTone

CIImageのAVSemanticSegmentationMatteからの初期化メソッド

AVSemanticSegmentationMatteはまだ紹介してませんが、名前からしてPortraitMatteの汎用版(Portrait Matteは人間の全身専用マスクだが、もうちょっと汎用的に領域分割するマスク)で、そこからCIImageを生成するメソッドが追加されています。

init?(semanticSegmentationMatte: AVSemanticSegmentationMatte)
init?(semanticSegmentationMatte: AVSemanticSegmentationMatte, options: [CIImageOption : Any]?)

パパッと既存の(≠オリジナルの)画像処理を適用するにはやっぱりCore Imageが簡単なので、これは必須ですね。

CGImageSourceを渡すイニシャライザも追加されています(今までなかったんだっけ。。?)

init(cgImageSource: CGImageSource, index: Int, options: [CIImageOption : Any]?)

AVSemanticSegmentationMatteオブジェクトにはプロパティからアクセスできる(持っていれば)ようです。

var semanticSegmentationMatte: AVSemanticSegmentationMatte?

一色のCIImageを生成する?

ドキュメントには解説がなかったのですが、CIImageに以下のような型プロパティが追加されています。一色塗りのCIImageオブジェクトを生成するのでしょうか?

class var black: CIImage
class var blue: CIImage
class var clear: CIImage
class var cyan: CIImage
class var gray: CIImage
class var green: CIImage
class var magenta: CIImage
class var red: CIImage
class var white: CIImage
class var yellow: CIImage

CIFilterに追加された初期化メソッド一覧

上で解説した、CIFilterを生成するメソッド一覧です。しれっと新たに追加されたフィルタもあるかもしれません。

class func accordionFoldTransition() -> CIFilter & CIAccordionFoldTransition
class func additionCompositing() -> CIFilter & CICompositeOperation
class func affineClamp() -> CIFilter & CIAffineClamp
class func affineTile() -> CIFilter & CIAffineTile
class func attributedTextImageGenerator() -> CIFilter & CIAttributedTextImageGenerator
class func aztecCodeGenerator() -> CIFilter & CIAztecCodeGenerator
class func barcodeGenerator() -> CIFilter & CIBarcodeGenerator
class func barsSwipeTransition() -> CIFilter & CIBarsSwipeTransition
class func bicubicScaleTransform() -> CIFilter & CIBicubicScaleTransform
class func blendWithAlphaMask() -> CIFilter & CIBlendWithMask
class func blendWithBlueMask() -> CIFilter & CIBlendWithMask
class func blendWithMask() -> CIFilter & CIBlendWithMask
class func blendWithRedMask() -> CIFilter & CIBlendWithMask
class func bloom() -> CIFilter & CIBloom
class func bokehBlur() -> CIFilter & CIBokehBlur
class func boxBlur() -> CIFilter & CIBoxBlur
class func checkerboardGenerator() -> CIFilter & CICheckerboardGenerator
class func circularScreen() -> CIFilter & CICircularScreen
class func cmykHalftone() -> CIFilter & CICMYKHalftone
class func code128BarcodeGenerator() -> CIFilter & CICode128BarcodeGenerator
class func colorBlendMode() -> CIFilter & CICompositeOperation
class func colorBurnBlendMode() -> CIFilter & CICompositeOperation
class func colorClamp() -> CIFilter & CIColorClamp
class func colorControls() -> CIFilter & CIColorControls
class func colorCrossPolynomial() -> CIFilter & CIColorCrossPolynomial
class func colorCube() -> CIFilter & CIColorCube
class func colorCubeWithColorSpace() -> CIFilter & CIColorCubeWithColorSpace
class func colorCubesMixedWithMask() -> CIFilter & CIColorCubesMixedWithMask
class func colorCurves() -> CIFilter & CIColorCurves
class func colorDodgeBlendMode() -> CIFilter & CICompositeOperation
class func colorInvert() -> CIFilter & CIColorInvert
class func colorMap() -> CIFilter & CIColorMap
class func colorMatrix() -> CIFilter & CIColorMatrix
class func colorMonochrome() -> CIFilter & CIColorMonochrome
class func colorPolynomial() -> CIFilter & CIColorPolynomial
class func colorPosterize() -> CIFilter & CIColorPosterize
class func comicEffect() -> CIFilter & CIComicEffect
class func convolution3X3() -> CIFilter & CIConvolution
class func convolution5X5() -> CIFilter & CIConvolution
class func convolution7X7() -> CIFilter & CIConvolution
class func convolution9Horizontal() -> CIFilter & CIConvolution
class func convolution9Vertical() -> CIFilter & CIConvolution
class func copyMachineTransition() -> CIFilter & CICopyMachineTransition
class func coreMLModel() -> CIFilter & CICoreMLModel
class func crystallize() -> CIFilter & CICrystallize
class func darkenBlendMode() -> CIFilter & CICompositeOperation
class func depthOfField() -> CIFilter & CIDepthOfField
class func depthToDisparity() -> CIFilter & CIDepthToDisparity
class func differenceBlendMode() -> CIFilter & CICompositeOperation
class func discBlur() -> CIFilter & CIDiscBlur
class func disintegrateWithMaskTransition() -> CIFilter & CIDisintegrateWithMaskTransition
class func disparityToDepth() -> CIFilter & CIDisparityToDepth
class func dissolveTransition() -> CIFilter & CIDissolveTransition
class func dither() -> CIFilter & CIDither
class func divideBlendMode() -> CIFilter & CICompositeOperation
class func documentEnhancer() -> CIFilter & CIDocumentEnhancer
class func dotScreen() -> CIFilter & CIDotScreen
class func edgePreserveUpsample() -> CIFilter & CIEdgePreserveUpsample
class func edgeWork() -> CIFilter & CIEdgeWork
class func edges() -> CIFilter & CIEdges
class func eightfoldReflectedTile() -> CIFilter & CIEightfoldReflectedTile
class func exclusionBlendMode() -> CIFilter & CICompositeOperation
class func exposureAdjust() -> CIFilter & CIExposureAdjust
class func falseColor() -> CIFilter & CIFalseColor
class func flashTransition() -> CIFilter & CIFlashTransition
class func fourfoldReflectedTile() -> CIFilter & CIFourfoldReflectedTile
class func fourfoldRotatedTile() -> CIFilter & CIFourfoldRotatedTile
class func fourfoldTranslatedTile() -> CIFilter & CIFourfoldTranslatedTile
class func gammaAdjust() -> CIFilter & CIGammaAdjust
class func gaussianBlur() -> CIFilter & CIGaussianBlur
class func gaussianGradient() -> CIFilter & CIGaussianGradient
class func glideReflectedTile() -> CIFilter & CIGlideReflectedTile
class func gloom() -> CIFilter & CIGloom
class func hardLightBlendMode() -> CIFilter & CICompositeOperation
class func hatchedScreen() -> CIFilter & CIHatchedScreen
class func heightFieldFromMask() -> CIFilter & CIHeightFieldFromMask
class func hexagonalPixellate() -> CIFilter & CIHexagonalPixellate
class func highlightShadowAdjust() -> CIFilter & CIHighlightShadowAdjust
class func hueAdjust() -> CIFilter & CIHueAdjust
class func hueBlendMode() -> CIFilter & CICompositeOperation
class func hueSaturationValueGradient() -> CIFilter & CIHueSaturationValueGradient
class func kaleidoscope() -> CIFilter & CIKaleidoscope
class func labDeltaE() -> CIFilter & CILabDeltaE
class func lanczosScaleTransform() -> CIFilter & CILanczosScaleTransform
class func lenticularHaloGenerator() -> CIFilter & CILenticularHaloGenerator
class func lightenBlendMode() -> CIFilter & CICompositeOperation
class func lineOverlay() -> CIFilter & CILineOverlay
class func lineScreen() -> CIFilter & CILineScreen
class func linearBurnBlendMode() -> CIFilter & CICompositeOperation
class func linearDodgeBlendMode() -> CIFilter & CICompositeOperation
class func linearGradient() -> CIFilter & CILinearGradient
class func linearToSRGBToneCurve() -> CIFilter & CILinearToSRGBToneCurve
class func luminosityBlendMode() -> CIFilter & CICompositeOperation
class func maskToAlpha() -> CIFilter & CIMaskToAlpha
class func maskedVariableBlur() -> CIFilter & CIMaskedVariableBlur
class func maximumComponent() -> CIFilter & CIMaximumComponent
class func maximumCompositing() -> CIFilter & CICompositeOperation
class func median() -> CIFilter & CIMedian
class func meshGenerator() -> CIFilter & CIMeshGenerator
class func minimumComponent() -> CIFilter & CIMinimumComponent
class func minimumCompositing() -> CIFilter & CICompositeOperation
class func mix() -> CIFilter & CIMix
class func modTransition() -> CIFilter & CIModTransition
class func morphologyGradient() -> CIFilter & CIMorphologyGradient
class func morphologyMaximum() -> CIFilter & CIMorphologyMaximum
class func morphologyMinimum() -> CIFilter & CIMorphologyMinimum
class func morphologyRectangleMaximum() -> CIFilter & CIMorphologyRectangleMaximum
class func morphologyRectangleMinimum() -> CIFilter & CIMorphologyRectangleMinimum
class func motionBlur() -> CIFilter & CIMotionBlur
class func multiplyBlendMode() -> CIFilter & CICompositeOperation
class func multiplyCompositing() -> CIFilter & CICompositeOperation
class func noiseReduction() -> CIFilter & CINoiseReduction
class func opTile() -> CIFilter & CIOpTile
class func overlayBlendMode() -> CIFilter & CICompositeOperation
class func pageCurlTransition() -> CIFilter & CIPageCurlTransition
class func pageCurlWithShadowTransition() -> CIFilter & CIPageCurlWithShadowTransition
class func paletteCentroid() -> CIFilter & CIPaletteCentroid
class func palettize() -> CIFilter & CIPalettize
class func parallelogramTile() -> CIFilter & CIParallelogramTile
class func pdf417BarcodeGenerator() -> CIFilter & CIPDF417BarcodeGenerator
class func perspectiveCorrection() -> CIFilter & CIPerspectiveCorrection
class func perspectiveTile() -> CIFilter & CIPerspectiveTile
class func perspectiveTransform() -> CIFilter & CIPerspectiveTransform
class func perspectiveTransformWithExtent() -> CIFilter & CIPerspectiveTransformWithExtent
class func photoEffectChrome() -> CIFilter & CIPhotoEffect
class func photoEffectFade() -> CIFilter & CIPhotoEffect
class func photoEffectInstant() -> CIFilter & CIPhotoEffect
class func photoEffectMono() -> CIFilter & CIPhotoEffect
class func photoEffectNoir() -> CIFilter & CIPhotoEffect
class func photoEffectProcess() -> CIFilter & CIPhotoEffect
class func photoEffectTonal() -> CIFilter & CIPhotoEffect
class func photoEffectTransfer() -> CIFilter & CIPhotoEffect
class func pinLightBlendMode() -> CIFilter & CICompositeOperation
class func pixellate() -> CIFilter & CIPixellate
class func pointillize() -> CIFilter & CIPointillize
class func qrCodeGenerator() -> CIFilter & CIQRCodeGenerator
class func radialGradient() -> CIFilter & CIRadialGradient
class func randomGenerator() -> CIFilter & CIRandomGenerator
class func rippleTransition() -> CIFilter & CIRippleTransition
class func sRGBToneCurveToLinear() -> CIFilter & CISRGBToneCurveToLinear
class func saliencyMap() -> CIFilter & CISaliencyMap
class func saturationBlendMode() -> CIFilter & CICompositeOperation
class func screenBlendMode() -> CIFilter & CICompositeOperation
class func sepiaTone() -> CIFilter & CISepiaTone
class func shadedMaterial() -> CIFilter & CIShadedMaterial
class func sharpenLuminance() -> CIFilter & CISharpenLuminance
class func sixfoldReflectedTile() -> CIFilter & CISixfoldReflectedTile
class func sixfoldRotatedTile() -> CIFilter & CISixfoldRotatedTile
class func smoothLinearGradient() -> CIFilter & CISmoothLinearGradient
class func softLightBlendMode() -> CIFilter & CICompositeOperation
class func sourceAtopCompositing() -> CIFilter & CICompositeOperation
class func sourceInCompositing() -> CIFilter & CICompositeOperation
class func sourceOutCompositing() -> CIFilter & CICompositeOperation
class func sourceOverCompositing() -> CIFilter & CICompositeOperation
class func spotColor() -> CIFilter & CISpotColor
class func spotLight() -> CIFilter & CISpotLight
class func starShineGenerator() -> CIFilter & CIStarShineGenerator
class func straighten() -> CIFilter & CIStraighten
class func stripesGenerator() -> CIFilter & CIStripesGenerator
class func subtractBlendMode() -> CIFilter & CICompositeOperation
class func sunbeamsGenerator() -> CIFilter & CISunbeamsGenerator
class func supportedRawCameraModels() -> [String]!
class func swipeTransition() -> CIFilter & CISwipeTransition
class func temperatureAndTint() -> CIFilter & CITemperatureAndTint
class func textImageGenerator() -> CIFilter & CITextImageGenerator
class func thermal() -> CIFilter & CIThermal
class func toneCurve() -> CIFilter & CIToneCurve
class func triangleKaleidoscope() -> CIFilter & CITriangleKaleidoscope
class func triangleTile() -> CIFilter & CITriangleTile
class func twelvefoldReflectedTile() -> CIFilter & CITwelvefoldReflectedTile
class func unsharpMask() -> CIFilter & CIUnsharpMask
class func vibrance() -> CIFilter & CIVibrance
class func vignette() -> CIFilter & CIVignette
class func vignetteEffect() -> CIFilter & CIVignetteEffect
class func whitePointAdjust() -> CIFilter & CIWhitePointAdjust
class func xRay() -> CIFilter & CIXRay
class func zoomBlur() -> CIFilter & CIZoomBlur