我写了一个基于多点触控的照片调整程序。UIImageView 显示照片时,根据用户触摸设置变换值,以扩大/缩小图像。这是一些处理多点触控的代码。
-(void) viewPanned:(UIPanGestureRecognizer *)g
{
CGPoint translate = [g translationInView:imageView];
CGAffineTransform nt = CGAffineTransformMake(1.0, 0, 0, 1.0, translate.x, translate.y ) ;
imageView.transform = CGAffineTransformConcat( transform, nt ) ;
if( g.state == UIGestureRecognizerStateEnded ) {
transform = imageView.transform ;
}
}
-(void) viewPinched:(UIPinchGestureRecognizer *)g
{
switch (g.state) {
case UIGestureRecognizerStateBegan:
{
startScale = g.scale ;
}
break;
case UIGestureRecognizerStateChanged:
{
CGFloat change = g.scale ;
switch( currentMode ) {
case 0:
imageView.transform = CGAffineTransformScale( transform, change, change ) ;
break ;
case 1:
imageView.transform = CGAffineTransformScale( transform, change, 1.0 ) ;
break ;
case 2:
imageView.transform = CGAffineTransformScale( transform, 1.0, change ) ;
break ;
}
}
break ;
case UIGestureRecognizerStateEnded:
{
transform = imageView.transform ;
}
default:
break;
}
}
-(void) viewRotated:(UIRotationGestureRecognizer *)g
{
CGFloat rotation = g.rotation ;
imageView.transform = CGAffineTransformRotate(transform, rotation) ;
if( g.state == UIGestureRecognizerStateEnded ) {
transform = imageView.transform ;
}
}
因此,程序会保留原始照片并更改变换值以显示调整。最后,我得到了原始图像和变换值作为结果。至于使用 UIImageView,我可以通过将 .image 设置为原始照片并将 .transform 设置为调整的结果来重现调整后的图像。现在,要将调整后的图像重绘为单个图像,我尝试使用 CGContextConcatCTM 将变换应用于绘图图像。
-(UIImage *)shrinkImage:(UIImage *)img size:(CGSize)size transform:(CGAffineTransform)transform
{
UIImage *sImage ;
CGSize trSize = CGSizeApplyAffineTransform( size, transform ) ;
UIGraphicsBeginImageContext(trSize) ;
CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform tr = CGAffineTransformIdentity;
//tr = CGAffineTransformTranslate(tr, trSize.width/2, trSize.height/2); // only works on rotate
tr = CGAffineTransformConcat(tr , transform);
//tr = CGAffineTransformScale(tr, 1.0, -1.0);
CGContextConcatCTM(context, tr);
CGRect rect ;
rect.origin = CGPointZero ;
rect.size = size ;
[img drawInRect:rect] ;
//CGContextDrawImage(context, rect, img.CGImage); // no difference
sImage = UIGraphicsGetImageFromCurrentImageContext() ;
UIGraphicsEndImageContext() ;
return sImage ;
}
然后我得到了一个错误的图像,大多数情况下结果与我预期的图像不同。(我可以使用 UIImageView 与变换得到什么)我搜索了这个套件和其他套件,并找到了一些旋转解决方案,但是对于任何类型的变换都没有通用解决方案。有些机制仅适用于旋转,有些适用于扩展等。似乎 UIImageView 变换和 CGContextConcatCTM 之间的轴差异导致了问题。但我找不到任何相关信息。逻辑上 Core graphics 和 UIView origin 应该是相同的。
谁能告诉我什么是通用解决方案?