iphone - 如何在转换后使用 UIImageWriteToSavedPhotosAlbum 保存图像

标签 iphone uiimage uipickerview cgcontext

好吧,我已经搜索遍了,但似乎找不到我需要的答案。 :-(

这是我正在做的事情以及我需要发生的事情。我有一个 UIImageView,我可以使用 UIPanGestureRecognizer、UIRotationGestureRecognizer 和 UIPinchGestureRecognizer 进行转换,所有这些都非常有效。当需要将这些转换保存到我的相册时,问题就出现了。结果不是我所期望的。到目前为止,这是我正在使用的代码(虽然非常不完整)

-(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,而且我对变换矩阵的理解是有限的。我确实知道我的转换不在图像数据本身上,因为尝试直接保存图像而不应用此上下文不会执行任何操作。那么请问有人可以帮我解决这个问题吗?

最佳答案

您通常希望在缩放之前进行翻译。

您已经翻转了坐标系,但仍然分配旧的 x 和 y 值。我认为你应该:

 CGFloat y = face.transform.tx;
 CGFloat x = face.transform.ty;

这段代码中没有定义face对象。如果它关闭,其他一切都会关闭。如果它是一个属性,您应该使用 self.face 引用表单来确保它可以正确访问。

我建议最后执行比例变换。

如果这些都不起作用。注释掉除一个转换之外的所有转换,并查看该单一转换是否有效。然后添加其他的,直到失败为止。

关于iphone - 如何在转换后使用 UIImageWriteToSavedPhotosAlbum 保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291851/

相关文章:

iOS:dispatch_async 和 UIImageWriteToSavedPhotosAlbum

ios - 在 uiimageview 上方绘制和移动图像 - Swift

ios - 如何在更改文本颜色后用数组填充 UIpickerView?

ios - 使用 xib 创建自定义 MKAnnotationView

iphone - 打开某种文件格式

iphone - 将图像保存到默认相机文件夹 - IOS

ios - UIPickerView 不会显示从 NSUserDefaults 加载的数据 - 应用程序在加载数据时崩溃

objective-c - 在 UIPickerView 的 numberOfRowsInComponent 中返回 [anArray count] 时出错

iphone - 细胞背景及配件

iPhone SDK 4 AVFoundation - 如何正确使用 captureStillImageAsynchronouslyFromConnection?