2013-10-14 2 views
3

Я использую этот код для изменения размера изображения, сделанного камерой. Я уменьшаю его пропорционально миниатюре, но потом я хотел бы обрезать его в квадратный формат 60x60. Я попытался включения:Изменение размера UIImage пропорционально урожая

CGImageRef imageRef = CGImageCreateWithImageInRect(CGImage, rect); 

, но мне не удалось получить его работу correctly.How бы я сделать это с помощью 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; 
} 

ответ

13

Здесь я помещаю логику как обрезать, так и изменять размер изображения, использовать его согласно вашему требованию.

Для Получить кадрирования:

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; 
    } 

Здесь вы получите Croped изображения, которые возвращают по выше Способ;

ИЛИ ИЗМЕНЕНИЕ РАЗМЕРА

, а также использовать следующий метод с конкретной Hight и ширина изображения для изменения размера:

возвращения
+ (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, с определенным размером, который вам хотеть.

+0

Используйте 'CGFloat', а не' float' или 'int'. –

+0

@GuyKogus - Спасибо .. вы можете объяснить причину этого ?? потому что я не понимаю тебя .. а также я использовал эту логику в своих проектах, и она хорошо работает. спасибо :) – iPatel

+0

Там довольно много. Проблема в том, что вы неявно конвертируете между типами данных. Это может привести к непредсказуемым значениям, например. когда у вас есть 'float' из 3.5 конвертирования в' int', результат может быть 4, если он раундов, но, скорее всего, он преобразует его в 3 по мере его обрезания. Вы хотите быть максимально последовательными с типами данных, которые вы используете, и если вам нужно преобразовать, то делайте это явно и по уважительным причинам. Не возражаете, если я отредактирую ваш ответ, чтобы показать, что это должно быть? –

4

Просто хотелось указать, что для производительности лучше обрезать изображение сначала, а затем изменить размер обрезанной части, чем изменить размер всего изображения, а затем обрезать его. Особенно для больших изображений.

+0

Пробовали ли вы это обрезку, прежде чем изменение размера займет меньше памяти, чем по-другому? Я просто тестировал инструменты и каждый раз изменял размер, прежде чем кадрирование потребляет на 20% меньше памяти (2448, 3264) –

+0

Если вы используете CIImage на iOS или что-то подобное, то он может делать некоторые оптимизации под капотом, как укладка операции.Понятно, что для изменения размера изображения 2048 X 1024 пикселов требуется больше времени, а затем скажем 320 X 240 –

+0

Я использую пример AVCam и делаю снимок и пытаюсь создать квадратное изображение (например, 640x640 с 2448x3264). Когда я пытаюсь обрезать до 2448x2448, тогда измените размер до 640x640, это займет около 65 Мб, когда я изменил размер, а затем обрезаю его примерно на 53 Мб. –

Смежные вопросы