У меня проблема с фильтром преобразования GPUImage. Я использую распознаватель жестов для перемещения изображения. Код, который у меня есть, но изображение движется примерно на половину скорости. Если я удвою свои координаты CGAffineTransform newTransform
, изображение будет выглядеть как ожидалось. Однако, когда я начинаю новый жест панорамы, изображение прыгает в точку примерно в два раза больше расстояния от центра. Возможно, моя математика отключена. Есть идеи? Или, может ли кто-нибудь предложить лучшее решение, чем то, что у меня здесь?Перевести положение GPUImage с помощью GPUImageTransformFilter и iOS Pan Gesture?
- (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];
}
Вместо того, чтобы пытаться вырвать компоненты матрицы, как насчет перевода преобразования, которое вы возвращаете постепенно, используя 'CGAffineTransformTranslate()'? Тогда вам просто нужно масштабировать из перевода CGPoint, который вы вернетесь в преобразование для GPUImage. –
Спасибо за предложение (и за большую библиотеку), @BradLarson. Я придумал решение, используя CGAffineTransformTranslate() (в ответ). Я должен был также учитывать масштаб преобразования. – Corey