将图像放在另一个图像之上
Posted
技术标签:
【中文标题】将图像放在另一个图像之上【英文标题】:Place an image on top of another image 【发布时间】:2013-04-17 14:36:17 【问题描述】:我想做的是以下。用户可以使用 iPhone 相机拍照。拍照后,他们将在所拍照片的顶部放置另一张图像。放置在顶部的图像也应旋转 25°。除了旋转之外,我还需要将顶部的图像降低到拍摄照片下方一点。 你可以在这里看到我的意思。
我有以下。
-(UIImage *)drawImage:(UIImage*)profileImage withBadge:(UIImage *)badge
UIGraphicsBeginImageContextWithOptions(profileImage.size, NO, 0.0f);
[profileImage drawInRect:CGRectMake(0, 0, profileImage.size.width, profileImage.size.height)];
[badge drawInRect:CGRectMake(profileImage.size.width - badge.size.width, profileImage.size.height - badge.size.height,badge.size.width,badge.size.height)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
-(void)captureImage
UIImage *img1 = [cropFilter imageFromCurrentlyProcessedOutput];
UIImage *img2 = [UIImage imageNamed:@"genkonstage.jpg"];
UIImage *img = [self drawImage:img1 withBadge:img2];
//UIImage *img = [cropFilter imageFromCurrentlyProcessedOutput];
[stillCamera.inputCamera unlockForConfiguration];
[stillCamera stopCameraCapture];
[self removeAllTargets];
staticPicture = [[GPUImagePicture alloc] initWithImage:img
smoothlyScaleOutput:YES];
谁能帮帮我?
【问题讨论】:
您的 drawImage:withBadge: 方法是否符合预期?似乎它应该致力于将两个图像混合在一起 是的,它将图像放在另一个之上。但我也想旋转它。我找不到使用 UIImage 的方法。 是的,在这种情况下,最好在上下文中执行此类操作(旋转等)。看看我的答案 【参考方案1】:我会建议这样的事情:
#define DEGREES_TO_RADIANS(x) (M_PI * x / 180.0)
-(UIImage *)drawImage:(UIImage*)profileImage withBadge:(UIImage *)badge
UIGraphicsBeginImageContextWithOptions(profileImage.size, NO, 0.0f);
CGContextRef imageContext = UIGraphicsGetCurrentContext();
CGContextClearRect(imageContext, CGRectMake(0, 0, profileImage.size.width, profileImage.size.height)); // just in case let's clear the context
[profileImage drawInRect:CGRectMake(0, 0, profileImage.size.width, profileImage.size.height)];
float angle = DEGREES_TO_RADIANS(20);
CGContextSaveGState (imageContext);
CGContextTranslateCTM(imageContext, profileImage.size.width - badge.size.width, profileImage.size.height - badge.size.height); // this will shift your context
CGAffineTransform rotationMatrix = CGAffineTransformMake(cos(angle), -sin(angle), sin(angle), cos(angle), 0, 0);
CGContextConcatCTM(imageContext, rotationMatrix); // this will rotate the context
// Now, having the context prepared (rotated and translated), draw the badge into it
[badge drawInRect:CGRectMake(0, 0, badge.size.width, badge.size.height)];
CGContextRestoreGState (imageContext);
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
这段代码对我有用。
【讨论】:
请让我知道结果,以便我为未来的读者编辑答案 这应该可以,但是您可以稍微简化一下代码。您可以简单地使用CGAffineTransformMakeRotation
,甚至CGContextRotateCTM
,而不是手动构造rotationMatrix
。此外,CGContextClearRect
在新创建的图像上下文中不需要(如果您仍然要使用它,您应该传递一个与图像上下文大小相同的矩形)。
谢谢,omz,好点子。只是关于清理......即使是新创建的上下文,我个人也遇到了“脏上下文”的问题。也许是因为其他一些问题,但现在我试图让自己确定:)
@makaron 很抱歉反应迟了。我用你的代码更新了我的代码。但现在他们没有图像放在另一个上面..
好吧,正如我之前所说,由于我是从记忆中编码的,因此可能存在一些不准确之处。这次我做了一些重要的修复并测试了结果。这件作品现在可以使用了。以上是关于将图像放在另一个图像之上的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ImageViews 放在另一个 ImageView 之上?