ObjecTips

基本Objective-Cで iOS とか OS X とか

iOS 11 Core Image の変更点

iOS 11 関連記事
iOS 11 UIKit の変更点 - ObjecTips
iOS 11 Foundation の変更点 - ObjecTips
iOS 11 Messages Framework の変更点 - ObjecTips
iOS 11 PDFKit - ObjecTips
Vision framework でテキスト検出 TextDetection - ObjecTips
Vision Framework で水平角検出(傾き) Horizon Detection - ObjecTips

Core Image

CIImage - Core Image | Apple Developer Documentation

CIImage
@property (nonatomic, readonly, nullable) AVDepthData *depthData NS_AVAILABLE(10_13,11_0);

Depthデータの取得。
イニシャライザのオプションで kCIImageAuxiliaryDepthkCIImageAuxiliaryDisparity のどちらかを YES に設定すると取得出来るらしい。このオプションを用いるとプライマリの画像の代わりに補助(auxiliary)画像の CIImage が作られて、もし補助画像が無い場合は nil になってしまうらしい。
補助画像は half float のモノクロ画像との事。

/* Returns a new image by changing the receiver's sample mode to bilinear interpolation. */
- (CIImage *)imageBySamplingLinear NS_AVAILABLE(10_13, 11_0)
  NS_SWIFT_NAME(samplingLinear());

/* Returns a new image by changing the receiver's sample mode to nearest neighbor. */
- (CIImage *)imageBySamplingNearest NS_AVAILABLE(10_13, 11_0)
  NS_SWIFT_NAME(samplingNearest());

画像の補間モードをバイリニア補間(bilinear interpolation)とニアレストネイバー(nearest neighbor)という補間方法に変換してくれるらしい。

CIFIlter

iOS 11 で追加された CIFIlter

CIAreaMinMaxRed
CIAttributedTextImageGenerator
CIBarcodeGenerator
CIBicubicScaleTransform
CIBokehBlur
CIColorCubesMixedWithMask
CIColorCurves
CIDepthBlurEffect
CIDepthToDisparity
CIDisparityToDepth
CIEdgePreserveUpsampleFilter
CILabDeltaE
CITextImageGenerator

DepthToDisparity と DepthToDisparity が存在していて Depth と Disparity の相互変換が出来るという事が分かる。

CIContext
- (nullable NSData*) PNGRepresentationOfImage:(CIImage*)image
                                       format:(CIFormat)format
                                   colorSpace:(CGColorSpaceRef)colorSpace
                                      options:(NSDictionary*)options NS_AVAILABLE(10_13,11_0);
- (nullable NSData*) HEIFRepresentationOfImage:(CIImage*)image
                                        format:(CIFormat)format
                                    colorSpace:(CGColorSpaceRef)colorSpace
                                       options:(NSDictionary*)options NS_AVAILABLE(10_13,11_0);
- (BOOL) writePNGRepresentationOfImage:(CIImage*)image
                                 toURL:(NSURL*)url
                                format:(CIFormat)format
                            colorSpace:(CGColorSpaceRef)colorSpace
                               options:(NSDictionary*)options
                                 error:(NSError **)errorPtr NS_AVAILABLE(10_13,11_0);
- (BOOL) writeHEIFRepresentationOfImage:(CIImage*)image
                                  toURL:(NSURL*)url
                                 format:(CIFormat)format
                             colorSpace:(CGColorSpaceRef)colorSpace
                                options:(NSDictionary*)options
                                  error:(NSError **)errorPtr NS_AVAILABLE(10_12,10_0);

これまではTIFFとJPEGに書き出す事が可能だったのが、PNGとHEIFへの書き出しも可能になった。

CORE_IMAGE_EXPORT NSString * const kCIImageRepresentationAVDepthData NS_AVAILABLE(10_13,11_0);
CORE_IMAGE_EXPORT NSString * const kCIImageRepresentationDepthImage NS_AVAILABLE(10_13,11_0);
CORE_IMAGE_EXPORT NSString * const kCIImageRepresentationDisparityImage NS_AVAILABLE(10_13,11_0);

上記の書き出しメソッドにオプションとして指定する事が出来る。ただしヘッダによればTIFFとPNGはオプション指定が不可で、JPEGとHEIFの場合にこれらのオプションが指定可能らしい。

CIRenderTask, CIRenderDestination, CIRenderInfo

非同期レンダリングのためのクラス群 CIRenderTask には

- (nullable CIRenderInfo*) waitUntilCompletedAndReturnError:(NSError**)error;

というメソッドがあるので同期的にも使えそう。

CIKernel
+ (nullable instancetype)kernelWithFunctionName:(NSString *)name
                           fromMetalLibraryData:(NSData *)data
                                          error:(NSError **)error NS_AVAILABLE(10_13, 11_0);

+ (nullable instancetype)kernelWithFunctionName:(NSString *)name
                           fromMetalLibraryData:(NSData *)data
                              outputPixelFormat:(CIFormat)format
                                          error:(NSError **)error NS_AVAILABLE(10_13, 11_0);

data には Core Image Standard Library でコンパイルされた mtallib ファイルのデータ、name には Metal Shading Language で書かれた関数名が必要らしい。

CIBlendKernel

2つの画像をブレンドする CIColorKernel のプリセット群の様なものが用意された。
例えば

@property (class, strong, readonly) CIBlendKernel *componentAdd;
@property (class, strong, readonly) CIBlendKernel *componentMultiply;

などクラスプロパティで簡易的にカーネル処理の色フィルタを呼び出す事が出来る。その数50個

CIBarcodeDescriptor

バーコードデータのモデルクラスでサブクラスとして以下が存在する。

  • CIQRCodeDescriptor
  • CIAztecCodeDescriptor
  • CIPDF417CodeDescriptor
  • CIDataMatrixCodeDescriptor`

バーコードの生成と、Core Image, Vision, AVFoundation でのバーコードの検出で使用されるとの事。
これまではカメラ画像からは AVFoundation を使って色々なバーコードを検出する事が出来たけど、静止画像からのバーコード検出は Core Image の CIFeature のサブクラスとして存在している CIQRCodeFeature でしか出来なかった。
iOS 11 では QRCode 以外の上記のバーコードも静止画からの検出が可能になるはず。

CIQRCodeFeature
@property (nullable, readonly) CIQRCodeDescriptor *symbolDescriptor NS_AVAILABLE(10_13, 11_0);

前述のバーコードのモデルクラスを取得可能。

感想

CIBlendKernel のプリセット呼び出しは簡単だけど CIFilter のカラーブレンド系とパフォーマンスが違うのか気になる。呼び出し型が違うだけで中の処理は同じではないか?とも思う。
HEIFデータの扱いとか AVDepthData の活用とかはしらばくは2眼カメラの iPhone 7 Plus に限定されてしまうかも知れないけど面白そう。このあたりの詳細は AVFoundation を調べる必要がありそう。