我在尝试合并两个UIImageView时变得疯狂。
情况:
我在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,因为它们在那个时刻显示但实际上我仍然没有找到它。
答案 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);
如果您有不同的方法,请告诉我。