Ios 使用类似照相机的instagram自动裁剪
我想从instagram这样的应用程序中拍摄一张方形照片。但是我不知道怎么做。我知道y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在视图中“实时”裁剪它。捕获图像时,它仍然是整个图像,并且仍然必须进行裁剪。只有用户没有看到它的发生,因为这一切都是在后台完成的。一旦你用你的相机捕捉到图像,把它 到UIImage的实例,然后编写一个方法,该方法将获取该UIImage并使用CGRefImageContext调整其大小,如果不再需要原始UIImage实例,则覆盖原始UIImage实例。我不知道该怎么做。是否有一个网站展示了如何做到这一点?还是有更简单的方法 首先,你需要用相机拍照,所以在你想拍照的地方添加此代码Ios 使用类似照相机的instagram自动裁剪,ios,crop,image,Ios,Crop,Image,我想从instagram这样的应用程序中拍摄一张方形照片。但是我不知道怎么做。我知道y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在视图中“实时”裁剪它。捕获图像时,它仍然是整个图像,并且仍然必须进行裁剪。只有用户没有看到它的发生,因为这一切都是在后台完成的。一旦你用你的相机捕捉到图像,把它 到UIImage的实例,然后编写一个方法,该方法将获取该UIImage并使用CGRefImageContext调整其大小,如果不再需要原始UIImage实例,则覆盖原始UIImage实例。我不知道该
UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerController.delegate = self;
[self presentViewController:pickerController
animated:YES
completion:nil];
}
然后,您需要实现委托方法。您的类必须符合UIImagePickerController-Delegate
,并有文档记录。在图像选择器控制器中:
如果使用info:
方法完成PickingMediaWithInfo:操作,您可以使用以下工具在UIImage
中拍摄照片:
UIImage *imageTaked = info[UIImagePickerControllerOriginalImage];
如果需要,此时您可以使用
info [UIImagePickerControllerMediaMetadata];
最后,当您的照片位于UIImage中时,您可以按如下方式裁剪图像:
CGFloat x, y, side; //We will see how to calculate those values later.
UIImage* imageCropped;
CGRect cropRect = CGRectMake(x,y,side,side);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageTaked CGImage], cropRect);
imageCropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
side = MIN(imageTaked.size.width, imageTaked.size.height
x = imageTaked.size.width / 2 - side / 2;
y = imageTaked.size.height / 2 - side / 2;
因此,这里重要的是如何计算cropRect
来切割UIImage的中心正方形。为此,您可以按如下方式计算x
、y
和side
:
CGFloat x, y, side; //We will see how to calculate those values later.
UIImage* imageCropped;
CGRect cropRect = CGRectMake(x,y,side,side);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageTaked CGImage], cropRect);
imageCropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
side = MIN(imageTaked.size.width, imageTaked.size.height
x = imageTaked.size.width / 2 - side / 2;
y = imageTaked.size.height / 2 - side / 2;
好的,总结一下,imagePickerController中的所有代码:
didFinishPickingMediaWithInfo:
方法的结果是:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *imageTaked = info[UIImagePickerControllerOriginalImage];
//You can take the metadata here => info [UIImagePickerControllerMediaMetadata];
UIImage* imageCropped;
CGFloat side = MIN(imageTaked.size.width, imageTaked.size.height);
CGFloat x = imageTaked.size.width / 2 - side / 2;
CGFloat y = imageTaked.size.height / 2 - side / 2;
CGRect cropRect = CGRectMake(x,y,side,side);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageTaked CGImage], cropRect);
imageCropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
}
编辑
如果要将照片发送到其他设备,可能会旋转照片。这是因为苹果对图像使用exif元数据,而其他平台则不这么做。要解决此问题,只需使用此方法设置适当的元数据信息:
-(UIImage*)getImageWithCorrectFiltersFromOriginalImage:(UIImage *)originalImage
{
UIImageOrientation orientation = UIImageOrientationUp;
NSNumber* orientationValue = [originalImage valueForProperty:@"ALAssetPropertyOrientation"];
if (orientationValue) {
orientation = [orientationValue intValue];
}
ALAssetRepresentation *assetRep = [originalImage defaultRepresentation];
CGImageRef imageRef = [assetRep fullResolutionImage];
return [UIImage imageWithCGImage:imageRef scale:[assetRep scale] orientation:orientation];
}
希望有帮助!如果复制粘贴过程中出现问题,请告诉我,现在是凌晨2点,我现在是个僵尸 您好,谢谢您的快速回复!只有几个问题。我想把它自动裁剪成像instagram一样的612x612。我应该在哪里更改代码?而且当我按下应用程序中的摄像头按钮时,它会启动摄像头,但我只想显示像instagram应用程序一样裁剪时剩余的区域。对不起,解释得不好,我理解。如果要绘制正方形,必须在设置
源类型之后,设置pickerController
的cameraOverlayView
属性。要在每侧裁剪612px的正方形,应将侧
值硬编码为612,但不建议这样做,因为您不知道UIImage的大小,即使您知道,它可能会随着iPhone摄像头分辨率的改变而改变。对不起,我太初学了。我该如何设置cameraOverlayView并使它看起来像instagram一样?即使我将其更改为612,它也确实发生了变化。您需要创建一个正方形的视图(如果您想在另一个线程中打开它,这是另一个问题),在创建该视图之后,以及在pickerController.sourceType=UIImagePickerControllerSourceTypeCamera之后代码>行,您应该使pickerController.cameraOverlayView=yourNewView代码>好的,我很困惑,我想忘记cameraOverlayView,只需将焦点裁剪到一个320x320的正方形,就像allowsediting一样。我将代码更改为CGFloat x=imageTaked.size.width/320-side/320;CGFloat y=图像拍摄的尺寸高度/320-侧面/320;