1

みなさん、良い一日を、

インターフェイスと、それらが相互に拡張/継承する方法について質問があります。この質問は、GPU プログラミングとはほとんど関係がありません。

質問:

GPUImageView と GPUImageInput の 2 つのインターフェイスがあります。

GPUImageView は次のように定義されています。interface GPUImageView : GPUImageInput { /*some code*/ }

私は機能を持っています:void AddTarget(GPUImageInput newTarget) {/*some code*/}

GPUImageView のインスタンスを AddTarget に渡すと、GPUImageView を GPUImageInput に変換できないというエラーが表示されます。

追加情報:

Monotouch の GPUImage ライブラリを btouch にバインドしようとしています。私は彼らの例の 1 つ (SimplePhotoFilter) をテストとして移植しようとしました。

これにより、

  • ViewDidLoad メソッドに入れたデモコード。
  • APIDefinitions.cs に必要なバインディングを入力しました。
  • とりあえず空のStructsAndEnums.cs。

APIDefinitions.cs のコードは次のとおりです。

namespace GPUImage
{
    [BaseType (typeof(UIView))]
    interface GPUImageView : GPUImageInput{
        [Export ("initWithFrame:")]
        IntPtr Constructor(RectangleF frame);

        [Export ("autoresizingMask")]
        UIViewAutoresizing AutoResizingMask { get; set;}

        [Export ("addSubView")]
        void AddSubView(UIView view);
    }

    [BaseType (typeof(NSObject))]
    [Model]
    interface AVCaptureVideoDataOutputSampleBufferDelegate{

    }

    [BaseType (typeof(NSObject))]
    [Model]
    interface AVCaptureAudioDataOutputSampleBufferDelegate{

    }

    [BaseType (typeof(GPUImageOutput))]
    interface GPUImageVideoCamera : AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate{
    }   

    [BaseType (typeof(GPUImageVideoCamera))]
    interface GPUImageStillCamera{
        [Export ("outputImageOrientation")]
        UIInterfaceOrientation OutputImageOrientation { get; set;}

        [Export ("startCameraCapture")]
        void StartCameraCapture();      
    }

    [BaseType (typeof(GPUImageSobelEdgeDetectionFilter))]
    interface GPUImageSketchFilter{ 
        [Export ("prepareForImageCapture")]
        void PrepareForImageCapture();
    }

    [BaseType (typeof(GPUImageTwoPassFilter))]
    interface GPUImageSobelEdgeDetectionFilter {
        [Export ("texelWidth")]
        float TexelWidth{ get; set;}

        [Export ("texelHeight")]
        float TexelHeight{ get; set;}
    }

    [BaseType (typeof(GPUImageFilter))]
    interface GPUImageTwoPassFilter {
    }

    [BaseType (typeof(GPUImageOutput))]
    interface GPUImageFilter : GPUImageInput{
    }

    [BaseType (typeof(NSObject))]
    [Model]
    interface  GPUImageInput{
    }

    [BaseType (typeof(NSObject))]
    interface  GPUImageOutput{
        [Export ("addTarget")]
        void AddTarget(GPUImageInput newTarget);
    }
}

そして、これはviewControllerのコードです:

GPUImage.GPUImageStillCamera stillCamera = new GPUImage.GPUImageStillCamera ();
stillCamera.OutputImageOrientation = UIInterfaceOrientation.Portrait;
GPUImage.GPUImageFilter filter = (GPUImage.GPUImageSketchFilter)new GPUImage.GPUImageSketchFilter ();
((GPUImage.GPUImageSketchFilter)filter).TexelHeight = 1.0f / 1024.0f;
((GPUImage.GPUImageSketchFilter)filter).TexelWidth = 1.0f / 768.0f;
((GPUImage.GPUImageSketchFilter)filter).PrepareForImageCapture ();
stillCamera.AddTarget (filter);
GPUImage.GPUImageView filterView = (GPUImage.GPUImageView)this.View;
filter.AddTarget (filterView);

そして、これらは私が得るエラーメッセージです: ImageProcessingLabViewController.cs(37,37): エラー CS1503: #1' cannot convert「GPUImage.GPUImageInput」を入力する引数 GPUImage.GPUImageOutput' 式 (CS1503) (ImageProcessingLab)

ImageProcessingLabViewController.cs(32,32): エラー CS1503: 引数#1' cannot convertGPUImage.GPUImageView' 式は、'GPUImage.GPUImageInput' を入力します (CS1503) (ImageProcessingLab)

しかし、ご覧のとおり、GPUImageFilter は GPUImageInput を継承/実装/拡張しているため、GPUImageSketchFilter、GPUImageOutput、および GPUImageView を GPUImageInput として使用/キャストできるはずです。

明確化: GPUImageInput を期待する AddTarget を呼び出そうとすると、エラーが発生します。GPUImageOutput から継承し、GPUImageInput を実装する GPUImageFilter を指定しています。GPUImageFilter は GPUImageInput にキャストできるはずですが、代わりにエラーが発生します。

どんな答えにも感謝します。何か不足していますか?ありがとうございました!

4

2 に答える 2

0

私はその特定のフレームワークに精通していませんが、実装のためのハードウェアオプションは限られています。

ライブラリが画像にGPGPU(CUDAなど)バッファを使用している場合、入力画像と出力画像に個別の定義はありません(おそらく、テクスチャメモリに基づく高速アクセス読み取り専用画像に個別の定義があります)。

ライブラリが標準のグラフィックスパイプラインを使用している場合、画像はパイプラインの入力として使用されるテクスチャに保存するか、パイプラインの出力として使用されるPBufferに保存できます-2つの別々の物理的(または論理的?)特定のハードウェア実装)の場所。

あるメモリタイプから別のメモリタイプにキャストを転送するだけでは不十分な場合は、バッファを読み取り、別の割り当てられた場所に書き込む必要があります。

フレームワークの実装では、両方に同じ基本クラスを使用できますが、実装には互換性がない可能性があります。

于 2012-06-03T17:16:21.770 に答える
0

そこにあるのは、コンパイル可能な C# コードではありません。これは Obj-C バインディング定義です。次に、btouch コマンド ライン ユーティリティが実際の C# コードを生成し、参照可能なライブラリにコンパイルします。あなたの例では、コンパイルされたアセンブリのクラスは次のように定義されています

public class GPUImageView : UIView
{
}

public class GPUImageOutput : NSObject
{
}

どちらも実際には GPUImageInput を継承しておらず、実際にはインターフェイスではありません。詳細については、このガイドを参照してください。

于 2013-08-23T01:34:37.570 に答える