カスタム Core Image フィルタを使用して特定の効果を得る OS X アプリを開発しています。ある画像の輝度を別の画像のアルファ チャネルとして設定します。画像を別の画像のマスクとして使用するフィルターがありますが、3 番目の背景画像が必要です。背景が設定されていない、透明部分のある画像を出力する必要があります。
Apple のドキュメントで説明されているように、カーネル コードを作成し、QuartzComposer でテストしました。期待どおりに動作します。
カーネルコードは次のとおりです。
kernel vec4 setMask(sampler src, sampler mask)
{
vec4 color = sample(src, samplerCoord(src));
vec4 alpha = sample(mask, samplerCoord(mask));
color.a = alpha.r;
// (mask image is grayscale; any channel colour will do)
return color;
}
しかし、コードからフィルターを使用しようとすると (イメージ ユニットとしてパッケージ化するか、アプリ ソースから直接)、出力イメージに次のような「未定義」(?) 範囲が含まれていることがわかります。
extent CGRect origin=(x=-8.988465674311579E+307, y=-8.988465674311579E+307) size=(width=1.797693134862316E+308, height=1.797693134862316E+308)
その後の処理 (NSImage ビットマップ表現への変換、ファイルへの書き込みなど) は失敗します。フィルター自体は完全に (nil ではなく) 読み込まれ、生成される出力画像も nil ではなく、無効な四角形が含まれているだけです。
編集: また、エクスポートされたイメージ ユニット (プラグイン) を と の両方にコピーして/Library/Graphics/Image Units
、~/Library/Graphics/Image Units
QuartzComposer のパッチ ライブラリに表示されるようにしましたが、ソース イメージと Billboard レンダラーに接続すると、何も描画されません (透明な背景)。
何か不足していますか?
編集:のデフォルトの動作について多くを想定しているように見えます-[CIFilter apply:]
。
私のフィルター サブクラス コードの-outputImage
実装は次のとおりです。
- (CIImage*) outputImage
{
CISampler* src = [CISampler samplerWithImage:inputImage];
CISampler* mask = [CISampler samplerWithImage:inputMaskImage];
return [self apply:setMaskKernel, src, mask, nil];
}
だから私は試して、これに変更しました:
- (CIImage*) outputImage
{
CISampler* src = [CISampler samplerWithImage:inputImage];
CISampler* mask = [CISampler samplerWithImage:inputMaskImage];
CGRect extent = [inputImage extent];
NSDictionary* options = @{ kCIApplyOptionExtent: @[@(extent.origin.x),
@(extent.origin.y),
@(extent.size.width),
@(extent.size.height)],
kCIApplyOptionDefinition: @[@(extent.origin.x),
@(extent.origin.y),
@(extent.size.width),
@(extent.size.height)]
};
return [self apply:setMaskKernel arguments:@[src, mask] options:options];
}
...そして今、それは動作します!