基本上我正在创建一个应用程序,涉及用户拍照,或选择已经在他们的设备上,然后在图像上放置一个叠加。
所以,我似乎编写了一切都很好,除了一件事,用户选择了叠加并定位后,当保存叠加的大小已经改变,而x和y值似乎是正确的。
所以这是我用来添加叠加层的代码(“图像”是用户照片):
float wid = (overlay.image.size.width);
float hei = (overlay.image.size.height);
overlay.frame = CGRectMake(0, 0, wid, hei);
[image addSubview:overlay];
这是用于保存结果图像的代码:
UIGraphicsBeginImageContext(image.image.size);
// Draw the users photo
[image.image drawInRect:CGRectMake(0, 0, image.image.size.width, image.image.size.height)];
// Draw the overlay
float xx = (overlay.center.x);
float yy = (overlay.center.y);
CGRect aaFrame = overlay.frame;
float width = aaFrame.size.width;
float height = aaFrame.size.height;
[overlay.image drawInRect:CGRectMake(xx, yy, width, height)];
UIGraphicsEndImageContext();
有任何帮助吗?感谢
答案 0 :(得分:2)
问题是您使用的是图像尺寸而不是图像视图的框架尺寸。图像看起来比它的图像视图大得多,所以当你使用图像的大小时,另一个图像的大小相比要小得多,尽管它仍然是正确的大小。您可以将代码段修改为 -
UIGraphicsBeginImageContext(image.frame.size);
// Draw the users photo
[image.image drawInRect:CGRectMake(0, 0, image.frame.size.width, image.frame.size.height)];
[overlay.image drawInRect:overlay.frame];
UIImage * resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
避免质量下降
虽然上述方法导致分辨率降低,但是试图以其适当的分辨率绘制父图像可能对其子图像产生不希望的影响,即如果覆盖本身不具有高分辨率,则它可能结束是有弹性的。但是,您可以尝试使用此代码在父图像的分辨率中绘制它(未经测试,如果您遇到问题请告诉我) -
float verticalScale = image.image.size.height / image.frame.size.height;
float horizontalScale = image.image.size.width / image.frame.size.width;
CGRect overlayFrame = overlay.frame;
overlayFrame.origin.x *= horizontalScale;
overlayFrame.origin.y *= verticalScale;
overlayFrame.size.width *= horizontalScale;
overlayFrame.size.height *= verticalScale;
UIGraphicsBeginImageContext(image.image.size);
// Draw the users photo
[image.image drawInRect:CGRectMake(0, 0, image.image.size.width, image.image.size.height)];
[overlay.image drawInRect:overlayFrame];
UIImage * resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();