我想从应用程序中取一个方形图片,如instagram.但是我不知道怎么做.我知道y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在视图中"实时"裁剪它.拍摄图像时,仍然是整个图像,仍然需要裁剪.只有用户才会看到它发生,因为它全部在后台完成.使用设备摄像头捕获图像后,将其放入UIImage的实例,然后编写一个将接受UIIMage并使用CGRefImageContext调整大小的方法,然后在不再需要原始UIImage实例的情况下覆盖原始UIImage实例.我不明白该怎么做.是否有网站显示如何执行此操作?或者有更简单的方法来做到这一点.
luc*_*t89 10
首先,您需要使用相机拍摄照片,因此请将此代码添加到您要拍照的位置.
UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerController.delegate = self;
[self presentViewController:pickerController
animated:YES
completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
然后,您需要实现委托方法.你的课必须符合UIImagePickerControllerDelegate,记录在这里.在该imagePickerController:
didFinishPickingMediaWithInfo:方法中,您可以拍摄照片UIImage:
UIImage *imageTaked = info[UIImagePickerControllerOriginalImage];
Run Code Online (Sandbox Code Playgroud)
如果您愿意,此时您可以使用拍摄的照片的元数据
info [UIImagePickerControllerMediaMetadata];
Run Code Online (Sandbox Code Playgroud)
最后,当您将照片放在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);
Run Code Online (Sandbox Code Playgroud)
因此,重要的是如何计算cropRect切割UIImage的中心方块.要做到这一点,就可以计算出x,y并且side如下:
side = MIN(imageTaked.size.width, imageTaked.size.height
x = imageTaked.size.width / 2 - side / 2;
y = imageTaked.size.height / 2 - side / 2;
Run Code Online (Sandbox Code Playgroud)
好的,总而言之,方法中的所有代码都会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);
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您想将照片发送到其他设备,可能会将照片旋转.那是因为Apple使用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];
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!如果在复制粘贴过程中出现问题,请告诉我,这是凌晨2点,我现在是个僵尸男人!