1

カスタム 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 UnitsQuartzComposer のパッチ ライブラリに表示されるようにしましたが、ソース イメージと 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];
}

...そして今、それは動作します!

4

1 に答える 1

1

どうやって描いてるの?そして、あなたのCIFilterコードはどのように見えますか? kCIApplyOptionDefinitionapply: in を呼び出すときに、最も可能性の高いを提供する必要がありますoutputImage

CIContextまたは、 を使用して、イメージの描画方法を変更することもできますdrawImage:inRect:fromRect

于 2013-11-03T20:44:44.163 に答える