简体   繁体   English

使用UIImagePickerController时如何更改裁剪矩形的大小

[英]How to change the size of the crop rect when using UIImagePickerController

I need to change the size of the cropping rect when using UIImagePickerController . 使用UIImagePickerController时,我需要更改裁剪矩形的大小。 In my case, I need the user to select images that are 320x385 but the crop rect currently only allows 320x320 (when allow editing is on). 就我而言,我需要用户选择320x385的图像,但裁剪区域当前仅允许320x320(启用允许编辑时)。

Any ideas? 有任何想法吗?

I have done a similar project. 我做了一个类似的项目。 You have to use an image controller. 您必须使用图像控制器。 Above your image controller you have to add another image controller (just because this is your crop area) aboveImageController's unfilled/empty part is where you will take. 在图像控制器上方,您需要在ImageController的未填充/空部分上方添加另一个图像控制器(仅因为这是您的裁剪区域)。 (so you should have an image with 320x480 sized and 320x385 empty in it.) (因此,您应该具有尺寸为320x480的图片,其中包含320x385的空白图片。)

UIImage *image=theimageView.image;  
CGSize newSize;
newSize.width=320;
newSize.height=385;
UIGraphicsBeginImageContext(newSize);

//x=0 (because widhth : 320) y=0 (aboveImageController's empty part's start) 
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGImageRef imageRef = CGImageCreateWithImageInRect([newImage CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);

After getting image from image picker and give crop functionality as different module. 从图像选择器获取图像并将裁剪功能作为其他模块提供。 So user can select the part of image which one they want to crop. 因此,用户可以选择他们想要裁剪的图像部分。

You can use this 你可以用这个

UIImage *image1 = [self resizeImage:image width:320 height:385];


-(UIImage *)resizeImage:(UIImage *)image width:(int)wdth height:(int)hght{
    int w = image.size.width;
    int h = image.size.height;
    CGImageRef imageRef = [image CGImage];
    int width, height;
    int destWidth = wdth;
    int destHeight = hght;
    if(w > h){
        width = destWidth;
        height = h*destWidth/w;
    }
    else {
        height = destHeight;
        width = w*destHeight/h;
    }
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmap;
    bitmap = CGBitmapContextCreate(NULL, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedFirst);

    if (image.imageOrientation == UIImageOrientationLeft) {

        CGContextRotateCTM (bitmap, M_PI/2);
        CGContextTranslateCTM (bitmap, 0, -height);

    } else if (image.imageOrientation == UIImageOrientationRight) {

        CGContextRotateCTM (bitmap, -M_PI/2);
        CGContextTranslateCTM (bitmap, -width, 0);

    }
    else if (image.imageOrientation == UIImageOrientationUp) {

    } else if (image.imageOrientation == UIImageOrientationDown) {

        CGContextTranslateCTM (bitmap, width,height);
        CGContextRotateCTM (bitmap, -M_PI);
    }

    CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage *result = [UIImage imageWithCGImage:ref];
    CGContextRelease(bitmap);
    CGImageRelease(ref);

    return result;

}

The dictionary in the delegate method returns all that: 委托方法中的字典返回所有内容:

NSString *const UIImagePickerControllerMediaType;
NSString *const UIImagePickerControllerOriginalImage;
NSString *const UIImagePickerControllerEditedImage;
NSString *const UIImagePickerControllerCropRect;
NSString *const UIImagePickerControllerMediaURL;
NSString *const UIImagePickerControllerReferenceURL;
NSString *const UIImagePickerControllerMediaMetadata;

I assume, you've been using the EditedImage which is pretty much useless ... maybe for some thumbnails ... anyway, the info dictionary contains CropRect data, only thing you have to do is to recalculate the sizes and crop the OriginalImage yourself, using for example this: UIImage: Resize, then Crop 我认为,您一直在使用EditedImage,这几乎是无用的……也许对于某些缩略图……无论如何,信息字典中包含CropRect数据,唯一要做的就是重新计算大小并自己裁剪原始Image ,例如使用: UIImage:调整大小,然后裁剪

I haven't tested, this is just theory :) ... but in theory, this should work :D 我还没有测试过,这只是理论上的:) ...但是从理论上讲,这应该可行:D

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM