将图像放在另一个图像之上

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 之上?

bootstrap - 如何将导航栏放在背景图像之上?

PHP - 将图像放在另一个图像上

如何将图像放在另一个图像视图中

使用 PDF itextSharp 可以在创建 pdf 文档时将图像放在文本之上

Android:将图像和文本视图放在另一个图像上