我试图模仿 Celebrity Clicks 的作用:为相机Feed添加名人贴纸,定位并缩放,然后拍摄照片。这应该会给你一张带贴纸的照片,这就是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;
}
我已附上前后照片,以便您可以看到我的问题。
相机设置屏幕:
使用带贴纸的相机拍摄的照片:
我猜测有更好的方法来合并两个图像,或者只是将给定坐标处的贴纸应用到相机捕获的图像。有什么建议吗?
答案 0 :(得分:1)
最简单的方法是在拾取器中保存添加视图的相对帧,然后在应用合并两个图像的添加图像时计算新帧。
这样做的其中一种方法是在拍摄照片时将帧的所有参数分别与超视图的宽度和高度分开,然后在尝试合并两者时将相同的帧坐标与图像宽度和高度相乘图像。
另外,对于你正在做的事情,我建议你丢失核心图形来绘制图像内容,而只是使用图像视图:用背景图像的大小创建图像视图,设置图像然后添加另一个图像视图添加的图像并如上所述设置框架。然后只需创建视图的屏幕截图,即可完成图像。这样,您就不会出现缩放,变换等问题。