2013-02-27 97 views
2

我遇到了使用GPUImage转换过滤器的问题。我正在使用平移手势识别器重新定位图像。我有的代码有效,但图像以大约一半的速度移动。如果我的坐标增加了一倍,图像就会像预期的那样拖动。但是,当我开始新的平移手势时,图像会跳到距离中心两倍的点。也许我的数学是关闭的。有任何想法吗?或者,任何人都可以提出比我在这里有更好的解决方案吗?使用GPUImageTransformFilter和iOS平移GPUImage位置Pan手势?

- (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]; 
} 
+1

不是试图抽出矩阵组件,而是使用'CGAffineTransformTranslate()'递增地转换回来的变换呢?然后,您只需从CGPoint翻译中进行缩放,即可返回到GPUImage的转换。 – 2013-03-01 03:45:01

+0

感谢您的建议(以及伟大的图书馆)@BradLarson。我想出了一个使用CGAffineTransformTranslate()(解答)的解决方案。我也必须考虑到变换比例。 – Corey 2013-03-01 17:30:41

回答

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屏幕有关。虽然,我还没有在非视网膜屏幕设备上测试过。

相关问题