好的,我已经搜遍了所有,我似乎无法找到我需要的答案。 : - (
这是我在做什么以及我需要做什么。我有一个UIImageView,我能够使用UIPanGestureRecognizer,UIRotationGestureRecognizer和UIPinchGestureRecognizer进行转换。当需要将这些transfomations保存到我的PhotoAlbum时,就会出现问题。结果不是我所期待的。到目前为止,这里是我正在使用的代码(可能非常不完整)
-(IBAction)saveface:(id)sender
{
static int kMaxResolution = 640;
CGImageRef imgRef = face.image.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
CGFloat ratio = width/height;
if (ratio > 1) {
bounds.size.width = kMaxResolution;
bounds.size.height = bounds.size.width / ratio;
} else {
bounds.size.height = kMaxResolution;
bounds.size.width = bounds.size.height * ratio;
}
}
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, 1, -1);
CGContextTranslateCTM(context, 0, -height);
NSLog(@"SAVE TX:%f TY:%f A:%f B:%f C:%f D:%f", face.transform.tx, face.transform.ty, face.transform.a,face.transform.b,face.transform.c,face.transform.d);
CGFloat x = face.transform.tx;
CGFloat y = face.transform.ty;
CGContextTranslateCTM (context, x,-y);
CGContextConcatCTM(context, face.transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(imageCopy, self, nil, nil);
}
通过这种方法,我可以保存图像,但坐标离开了。我可以看到我做的任何缩放都可行。我看到了我的轮换,但似乎是倒退,而且是呻吟声。
指环都是错的,对于我的生活,我无法弄清楚出了什么问题。我承认我是Objective-C的新手,之前我从未使用过Quartz 2D,而且我对变换矩阵的理解是有限的。我确实理解我的转换不是在图像数据本身上,因为尝试将图像保存在正确的状态而不应用此上下文。所以任何人都可以直截了当地告诉我这个吗?
答案 0 :(得分:2)
您通常希望在扩展之前进行翻译。
您已经翻转了坐标系,但仍然分配了旧的x和y值。我想你应该:
CGFloat y = face.transform.tx;
CGFloat x = face.transform.ty;
此代码中未定义face
对象。如果它关闭,其他一切都将关闭。如果是属性,则应使用self.face
引用表单以确保正确访问它。
我建议最后执行缩放变换。
如果这些都不起作用。注释除了一个变换之外的所有变换,看看单个变换是否有效。然后添加其他内容直到失败。
答案 1 :(得分:0)
如果您使用UIView中的图像,变换,缩放然后渲染图层,这种工作会更容易。它以后会节省各种麻烦。
类似的东西:
CGSize vscaledSize = myOriginalImage.size;
//add in the scaled bits of the view
//scaling
CGFloat wratio = vscaledSize.width/self.pictureView.frame.size.width;
CGFloat vhightScaled = self.pictureView.frame.size.height * wratio;
vscaledSize.height = vhightScaled;
CGFloat hratio = vscaledSize.height/self.pictureView.frame.size.height;
//create context
UIGraphicsBeginImageContext(myOriginalImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context); //1 original context
// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, vscaledSize.height);
CGContextScaleCTM(context, 1.0, -1.0);
//original image
CGContextDrawImage(context, CGRectMake(0,0,vscaledSize.width,vscaledSize.height), myOriginalImage.CGImage);
CGContextRestoreGState(context);//1 restore to original;
//scale context to match view size
CGContextSaveGState(context); //1 pre-scaled size
CGContextScaleCTM(context, wratio, hratio);
//render
[self.pictureView.layer renderInContext:context];
CGContextRestoreGState(context);//1 restore to pre-scaled size;
UIImage *exportImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
你会注意到我为图像渲染翻转coord系统,但是将其恢复到UIView.layer渲染的原始坐标系。
希望这有帮助