[iOS]从相机或相册获取图片后按比例编辑后返回新图片

[iOS]从相机或相册获取图片后按比例编辑后返回新图片

DEMO:http://download.csdn.net/detail/u012881779/9774191

简单描述一下,就是,需求要求从前端只能上传固定比例的图片,所以就有了本文;

部分代码:


#import "HomeViewController.h"
#import "UIImage+FixOrientation.h"
#import "CropController.h"
#import "CropSelectImageProtocol.h"

@interface HomeViewController () <CropSelectImageProtocol, UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *displayImg;
@property (strong, nonatomic) UIImagePickerController *ipc;

@end

@implementation HomeViewController

- (IBAction)selectPicAction:(id)sender {
    UIActionSheet *actionSheet = [[UIActionSheet alloc]
                                  initWithTitle:nil
                                  delegate:self
                                  cancelButtonTitle:@"取消"
                                  destructiveButtonTitle:nil
                                  otherButtonTitles:@"拍照",@"从相册选择",nil];
    actionSheet.actionSheetStyle=UIActionSheetStyleBlackTranslucent;
    actionSheet.tag = 1112;
    [actionSheet showInView:self.view];
}

#pragma mark - UIActionSheetDelegate
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (actionSheet.tag == 1112) {
        if(!ipc){
            ipc = [[UIImagePickerController alloc] init];
        }
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
            switch (buttonIndex) {
                case 0:
                    ipc.sourceType =  UIImagePickerControllerSourceTypeCamera;
                    ipc.delegate = self;
                    [self presentViewController:ipc animated:YES completion:^{
                    }];
                    break;
                case 1:
                    ipc.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;
                    ipc.delegate = self;
                    [self presentViewController:ipc animated:YES completion:^{
                    }];
                    break;
                default:
                    break;
            }
        }
    }
}

#pragma mark - 从相册选择图片后操作
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *_imageData = UIImageJPEGRepresentation([image fixOrientation], 1);
    
    CropController *_crop = [[CropController alloc] initWithImageData:_imageData];
    _crop._delegate = self;
    [picker pushViewController:_crop animated:YES];
}

#pragma mark - 取消操作时调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:^{
        
    }];
}

#pragma mark - CropSelectImageProtocol
- (void)cropSelectImageWith:(UIImage *)cropImage {
    // 将照片存到媒体库
    // UIImageWriteToSavedPhotosAlbum(cropImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    // 将照片存到沙盒
    // [self saveImage:cropImage];
    
    // 将照片赋给imageView
    self.displayImg.image = cropImage;
 
    [ipc dismissViewControllerAnimated:YES completion:^{
    }];
}

- (void)retakeSelectPhoto {
    if(ipc.sourceType == UIImagePickerControllerSourceTypeCamera){
        [ipc dismissViewControllerAnimated:NO completion:^{
        }];
        if(!ipc){
            ipc = [[UIImagePickerController alloc] init];
        }
        ipc.sourceType =  UIImagePickerControllerSourceTypeCamera;
        ipc.delegate = self;
        [self presentViewController:ipc animated:NO completion:^{
        }];
    }
}

#pragma mark - 照片存到本地后的回调
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
    if (!error) {
        NSLog(@"存储成功");
    } else {
        NSLog(@"存储失败:%@", error);
    }
}

#pragma mark - 保存图片
- (void)saveImage:(UIImage *)currentImage {
    // 设置照片的品质
    NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
    // 获取沙盒目录
    NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/currentImage.png"];
    // 将图片写入文件
    [imageData writeToFile:filePath atomically:NO];
}

#pragma mark - 自定义相机拍照后按钮Retake/Use Photo文字
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // 需要自定义文字便取消注释
    // [self addSomeElements:viewController];
}

- (void)addSomeElements:(UIViewController *)viewController {
    UIView *PLCameraView = [self findView:viewController.view withName:@"PLCropOverlay"];
    UIView *bottomBar = [self findView:PLCameraView withName:@"PLCropOverlayBottomBar"];
    UIImageView *bottomBarImageForSave = [bottomBar.subviews objectAtIndex:0];
    NSArray *barSubViews = bottomBarImageForSave.subviews;
    // 左下角Retake角按钮
    // <UIButtonLabel: 0x1003bb500; frame = (0 0; 0 0); text = 'Retake'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x170295090>>
    UIButton *retakeButton = [barSubViews firstObject];
    [retakeButton setTitle:@"重拍" forState:UIControlStateNormal];
    
    // 右下角Use Photo按钮,无法直接修改normal和highlighted状态下的text属性
    // <UIButtonLabel: 0x1003bbd20; frame = (0 0; 0 0); hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x170295180>>
    UIButton *useButton = [barSubViews lastObject];
    NSString *useString = @"使用";
    [useButton setTitle:useString forState:UIControlStateNormal];
    [useButton setTitle:useString forState:UIControlStateHighlighted];
    useButton.selected = YES;
    [useButton setTitle:useString forState:UIControlStateSelected];
}

- (UIView *)findView:(UIView *)aView withName:(NSString *)name {
    Class cl = [aView class];
    NSString *desc = [cl description];
    if ([name isEqualToString:desc]){
        return aView;
    }
    for (NSUInteger i = 0; i < [aView.subviews count]; i++){
        UIView *subView = [aView.subviews objectAtIndex:i];
        subView = [self findView:subView withName:name];
        if (subView){
            return subView;
        }
    }
    return nil;
}

@end
 
示意图:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值