2

GPUImage変換フィルターの使用に問題があります。パンジェスチャレコグナイザーを使用して画像の位置を変更しています。私が持っているコードは機能しますが、画像は約半分の速度で移動します。CGAffineTransform newTransform座標を2倍にすると、画像が期待どおりにドラッグされます。ただし、新しいパンジェスチャを開始すると、画像は中心から約2倍の距離のポイントにジャンプします。おそらく私の数学はオフです。何か案は?または、誰かが私がここに持っているものよりも良い解決策を提案できますか?

- (void)move:(UIPanGestureRecognizer *)sender {
    // Translated CGPoint from GPUImageView
    CGPoint translation = [sender translationInView:self.primaryImageView];
    // Current transform from GPUImageTransformFilter
    CGAffineTransform currentTransform = self.transFilter.affineTransform;
    // Size of GPUImageView bounds for later calculations
    CGSize size = self.primaryImageView.bounds.size;

    if ([sender state] == UIGestureRecognizerStateBegan) {
        // Set a beginning CGPoint 
        // Multiply GPUImageView bounds by current transform to get
        // the translated coordinates in pixels.
        self.beginPoint = CGPointMake(size.width*currentTransform.tx, size.height*currentTransform.ty);
    }

    // Calculate difference from beginning point to translated point
    CGPoint updatedPoint = CGPointMake(self.beginPoint.x+translation.x, self.beginPoint.y+translation.y);

    // Create a new transform translation.
    // Divide updated coordinates by GPUImageView bounds to get
    // a percentage value (-1 to 1)
    CGAffineTransform newTransform = CGAffineTransformMakeTranslation(updatedPoint.x/(size.width), updatedPoint.y/(size.height));

    // Apply new transform to filter and process.
    [self.transFilter setAffineTransform:newTransform];
    [self.sourcePicture processImage];
}
4

1 に答える 1

2

@BradLarsonが提案したように、私はを使用してソリューションを作成しましたCGAffineTransformTranslate()。また、位置を正確に変換するには、変換計算でも変換スケールを考慮に入れる必要があることもわかりました。これが私の解決策です:

- (void)move:(UIPanGestureRecognizer *)sender {
    CGPoint translatedPoint = [sender translationInView:self.primaryImageView];
    if ([sender state] == UIGestureRecognizerStateBegan) {
        self.lastPoint = translatedPoint;
    }

    CGSize size = self.primaryImageView.bounds.size;
    // Subtract the last point from the translated point to get the difference.
    CGPoint updatedPoint = CGPointMake(translatedPoint.x-self.lastPoint.x, translatedPoint.y-self.lastPoint.y);
    CGAffineTransform currentTransform = self.transFilter.affineTransform;
    // Divide updated point by the bounds to get the transform translate value.
    // Multiply transform value by the result of the offset factor divided
    // by the transform scale value.
    CGAffineTransform newTransform = CGAffineTransformTranslate(currentTransform, (updatedPoint.x/size.width)*(2/currentTransform.a), (updatedPoint.y/size.height)*(2/currentTransform.a));

    [self.transFilter setAffineTransform:newTransform];
    [self.sourcePicture processImage];
    self.lastPoint = translatedPoint;
}

オフセット係数をの値に設定しました2。なぜこのオフセットが必要なのかはまだわかりませんが、Retina画面に関係しているのではないかと思います。ただし、これは非網膜スクリーンデバイスではテストしていません。

于 2013-03-01T17:43:58.063 に答える