2014-12-21 36 views
0

我试图模仿什么Celebrity Clicks确实:添加一个名人贴纸相机饲料,定位和缩放,并拍摄照片。这应该会给你一张贴有应用贴纸的照片,这就是Celebrity Click所做的。不过,我无法将相机照片与贴纸合并。这里有几个问题:当应用于最终的相机图像时,贴纸的比例和位置是错误的,因为从相机拍摄的图像实际上在分辨率和尺寸方面都大于设置时实时相机提供的图片贴上标签。如何添加贴纸覆盖到相机照片

这是我现在在做什么:

[(GPUImageStillCamera *)videoCamera capturePhotoAsImageProcessedUpToFilter:selectedFilter withCompletionHandler:^(UIImage *processedImage, NSError *error) { 
    selectedImage = [self imageByCombiningImage:processedImage withImage:celebOverlayView.imageView.image]; 
}]; 

- (UIImage*)imageByCombiningImage:(UIImage*)firstImage withImage:(UIImage*)secondImage { 
UIImage *image = nil; 
CGSize newImageSize = CGSizeMake(MAX(firstImage.size.width, secondImage.size.width),   MAX(firstImage.size.height, secondImage.size.height)); 
if (UIGraphicsBeginImageContextWithOptions != NULL) { 
    UIGraphicsBeginImageContextWithOptions(newImageSize, NO, [[UIScreen mainScreen] scale]); 
} else { 
    UIGraphicsBeginImageContext(newImageSize); 
} 
[firstImage drawInRect:cameraView.frame]; 

[firstImage drawAtPoint:CGPointMake(roundf((newImageSize.width-firstImage.size.width)/2), 
            roundf((newImageSize.height-firstImage.size.height)/2))]; 
[secondImage drawAtPoint:CGPointMake(roundf((newImageSize.width-secondImage.size.width)/2), 
            roundf((newImageSize.height-secondImage.size.height)/2))]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; 
} 

我重视前后的照片,这样你可以看到我的问题。

摄像机设置屏幕:采用 enter image description here

照片拍摄与摄像头的贴纸: enter image description here

我猜测,有一种更好的方式来合并两个图像,或者简单地套用贴纸在给定坐标的相机拍摄图像。有什么建议么?

回答

1

如果您将添加视图的相对框架保存在选取器中,然后在应用组合这两个图像的添加图像时计算新框架,这是最简单的。

这样做的方法之一是,当拍摄照片时,将帧的所有参数分别与超视图的宽度和高度相除,然后在尝试合并图像时将相同的帧坐标与图像宽度和高度相乘两个图像。

此外,对于你在做什么,我建议你失去绘制图像内容的核心图形,而只是使用图像视图:使用背景图像的大小创建图像视图,设置图像,然后添加另一个图像视图与添加的图像并设置框架如上所述。然后,简单地创建视图的屏幕截图,然后完成图像。这样你就不会遇到缩放,变形等问题。

+0

所以你会建议创建一个视图,其中包含两个图像:一个来自相机的图像,一个带有贴纸,然后从该视图获取上下文截图? – damjandd

+0

是的,但您只需要2个视图,背景图像视图和叠加图像视图。采用这种屏幕截图与您在后台进行的操作非常相似,并且非常适合缩放,裁剪等操作。如果需要,请注意包含视图内容比例。 –

+0

那么从哪个视图我会截图?正如你从上面的图片中看到的那样,当时屏幕上还有其他元素,所以我不能只用整个屏幕。 – damjandd