通过手势UIImageView与另一个进行合并。 WYS不是WYG

时间:2011-07-08 09:29:03

标签: ios4 uiimageview uiimage cgcontext

我在尝试合并两个UIImageView时变得疯狂。

情况:

  • 后台UIImageView (userPhotoImageView)
  • 一个重叠的 UIImageView(productPhotoImageView) 可以拉伸,挤压和 旋转

我在UIImages上调用我的函数但是我可以从包含它们的UIImageView中获取coords和新的拉伸大小(它们在我的课程中合成)

    - (UIImage *)mergeImage:(UIImage *)bottomImg withImage:(UIImage *)topImg;

也许最简单的方法是在新的CGContextRef中渲染顶级UIImageView的层,如下所示:

    [bottomImg drawInRect:CGRectMake(0, 0, bottomImg.size.width, bottomImg.size.height)];
    [productPhotoImageView.layer renderInContext:ctx];

但是通过这种方式,我放松了手势所普遍应用的旋转效果。

第二种方法是尝试将AffineTransformation应用于UIImage以重现GestureEffects,然后在上下文中绘制它:

    UIImage * scaledTopImg = [topImg imageByScalingProportionallyToSize:productPhotoView.frame.size];
    UIImage * rotatedScaledTopImg = [scaledTopImg imageRotatedByDegrees:ANGLE];    
    [rotatedScaledTopImg drawAtPoint:CGPointMake(productPhotoView.frame.origin.x, productPhotoView.frame.origin.y)];

第二种方法的问题是,由于用户开始交互,我无法准确获得最终旋转度(应该在上面的代码中填充的ANGLE参数)量,这是因为RotationGesture被重置应用后为0,因此下一个回调是当前轮换的增量。

肯定最容易的方法是第一个,冻结两个UIImageViews,因为它们在那个时刻显示但实际上我仍然没有找到它。

3 个答案:

答案 0 :(得分:3)

伟大的,这是有帮助的,所以太多的解决方法;)

所以,因为我觉得很难找到一些代码示例来合并图片后,这里的操作是我的,希望它可以有所帮助:

- (UIImage *)mergeImage:(UIImage *)bottomImg withImage:(UIImage *)topImg {

    UIImage * scaledTopImg = [topImg imageByScalingProportionallyToSize:productPhotoView.frame.size];

    UIGraphicsBeginImageContext(scaledTopImg.size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, scaledTopImg.size.width * 0.5f, scaledTopImg.size.height  * 0.5f);    
    CGFloat angle = atan2(productPhotoView.transform.b, productPhotoView.transform.a);    
    CGContextRotateCTM(ctx, angle);    
    [scaledTopImg drawInRect:CGRectMake(- scaledTopImg.size.width * 0.5f, -(scaledTopImg.size.height  * 0.5f), scaledTopImg.size.width, scaledTopImg.size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIGraphicsBeginImageContext(bottomImg.size);
    [bottomImg drawInRect:CGRectMake(0, 0, bottomImg.size.width, bottomImg.size.height)];    
    [newImage drawInRect:CGRectMake(productPhotoView.frame.origin.x, productPhotoView.frame.origin.y, newImage.size.width, newImage.size.height)];
    UIImage *newImage2 = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();    

    return newImage2;
}

由于我得到了背景图像,因此首先创建一个上下文只是为了将转换应用于overlayview,而不是将其保存并写在底层之上。

在旋转叠加层视图之前处理CTM平移,否则它将围绕放置在{0,0}的轴旋转,而我想围绕其中心旋转图像。

此致

答案 1 :(得分:3)

好吧基本上所有这些疯狂合并的东西都有另一种解决方法,但它绝对不是一个优雅的解决方案。为避免处理任何类型的AffineTransformation,只需捕获ImageScreen然后裁剪它。

CGImageRef screenImage = UIGetScreenImage();
CGRect fullRect = [[UIScreen mainScreen] applicationFrame];
CGImageRef saveCGImage = CGImageCreateWithImageInRect(screenImage, fullRect);
CGRect cropRect = CGRectMake(x,y,width,height);
CGImageRef saveCGImage = CGImageCreateWithImageInRect(screenImage, cropRect);

告诉你它并不优雅,但对某人来说它可能很有用。

答案 2 :(得分:0)

我有同样的问题。

我只有轮换问题。

我使用手势识别器进行移动,缩放和旋转。

在开始保存图像时,比例是正确的,位置是正确的,但从不对已保存的图像应用旋转。

现在可行了

如果你想知道我得到的旋转角度:

CGFloat angle = atan2(overlay.transform.b, overlay.transform.a);

旋转:

CGContextRotateCTM(context, angle);

如果您有不同的方法,请告诉我。