【问题标题】:resize UIImage proportionally then crop按比例调整 UIImage 大小然后裁剪
【发布时间】:2013-10-22 01:06:23
【问题描述】:

我正在使用此代码来调整使用相机拍摄的图像的大小。我将其按比例缩小为缩略图,但随后我想将其裁剪为 60x60 方形格式。我尝试合并:

CGImageRef imageRef = CGImageCreateWithImageInRect(CGImage, rect); 

但我无法让它正常工作。我将如何使用 Core Graphics 来做到这一点?

- (UIImage *) resizeCapturedImage:(UIImage *) img toWidth:(float) w{

    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(NULL,w,w, 8, 0, colorspace,kCGImageAlphaPremultipliedFirst);

    CGContextDrawImage(ctx, CGRectMake(0, 0, w,img.size.width*w/img.size.height), img.CGImage);
    CGImageRef thumb = CGBitmapContextCreateImage(ctx);
    UIImage *final = [UIImage imageWithCGImage:thumb scale:1.0 orientation:UIImageOrientationRight];

    return final;
}

【问题讨论】:

    标签: ios objective-c uiimage core-graphics


    【解决方案1】:

    这里我放了裁剪和调整图像大小的逻辑,根据您的要求使用它。

    获取裁剪图像:

    UIImage *croppedImg = nil;
    CGRect cropRect = CGRectMake(AS YOu Need); // set frame as you need
    croppedImg = [self croppIngimageByImageName:self.imageView.image toRect:cropRect];
    

    以下方法返回UIImage你想要的图片大小

    - (UIImage *)croppIngimageByImageName:(UIImage *)imageToCrop toRect:(CGRect)rect
        {
            //CGRect CropRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height+15);
    
            CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
            UIImage *cropped = [UIImage imageWithCGImage:imageRef];
            CGImageRelease(imageRef);
    
            return cropped;
        }
    

    这里你会得到通过上述方法返回的裁剪图像;

    或调整大小

    并且还可以使用以下方法对图像的特定hightwidth进行调整:

    + (UIImage*)resizeImage:(UIImage*)image withWidth:(CGFloat)width withHeight:(CGFloat)height
    {
        CGSize newSize = CGSizeMake(width, height);
        CGFloat widthRatio = newSize.width/image.size.width;
        CGFloat heightRatio = newSize.height/image.size.height;
    
        if(widthRatio > heightRatio)
        {
            newSize=CGSizeMake(image.size.width*heightRatio,image.size.height*heightRatio);
        }
        else
        {
            newSize=CGSizeMake(image.size.width*widthRatio,image.size.height*widthRatio);
        }
    
    
        UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
        [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
        UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return newImage;
    }
    

    此方法返回 NewImage,具有您想要的特定大小。

    【讨论】:

    • 使用CGFloat,而不是floatint
    • @GuyKogus - 谢谢..你能解释一下原因吗?因为我不明白你......而且我在我的项目中使用了这个逻辑并且它运行良好。谢谢:)
    • 有很多内容。问题是您在数据类型之间进行隐式转换。这可能会导致不可预测的值,例如当您将 3.5 的 float 转换为 int 时,如果四舍五入,结果可能是 4,但更有可能在截断时将其转换为 3。您希望尽可能与您使用的数据类型保持一致,如果您必须转换,那么明确地这样做是有充分理由的。你介意我编辑你的答案以显示它应该是什么吗?
    • @GuyKogus - 谢谢你的信息..我会改变它:)
    • oPsss.. 对不起:(
    【解决方案2】:

    只是想指出,为了提高性能,最好先裁剪图像然后调整裁剪部分的大小,而不是调整整个图像的大小然后裁剪它。特别是对于较大的图像。

    【讨论】:

    • 您是否测试过,在调整大小之前进行裁剪比其他方式占用更少的内存?我刚刚使用仪器进行了测试,每次在裁剪前调整大小都会消耗大约 20% 的内存(2448、3264)
    • 如果您在 iOS 上使用 CIImage 或类似的东西,那么它可能会在后台进行一些优化,例如堆叠操作。从概念上讲,调整 2048 X 1024 像素图像的大小比 320 X 240 需要更长的时间
    • 我正在使用 AVCam 示例并拍照并尝试创建方形图像(例如 640x640 和 2448x3264)。当我尝试裁剪到 2448x2448 然后调整到 640x640 时大约需要 65Mb,当我调整大小然后裁剪时大约需要 53Mb。
    • 我说的是针对您的特定情况的性能而不是内存,您可能看不到性能优势,因为您正在从一个非常大的图像调整到另一个非常大的图像
    • 您知道同时执行这两项操作的最佳方法吗?
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2014-01-11
    • 2015-12-04
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多