Como resize a imagem programaticamente no objective-c no iphone

Eu tenho um aplicativo onde estou exibindo imagens grandes em um espaço pequeno. As imagens são muito grandes, mas estou exibindo-as apenas em frameworks de 100 x 100 pixels. Meu aplicativo está respondendo lentamente devido ao tamanho das imagens que estou usando.

Para melhorar o desempenho, como posso resize as imagens programaticamente usando o Objective-C?

    Por favor, encontre o seguinte código.

    - (UIImage *)imageWithImage:(UIImage *)image convertToSize:(CGSize)size { UIGraphicsBeginImageContext(size); [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return destImage; } 

    Este código é apenas para alterar a escala da imagem não para resize Você tem que definir CGSize como a largura e a altura da imagem para que a imagem não estique e organize no meio.

     - (UIImage *)imageWithImage:(UIImage *)image scaledToFillSize:(CGSize)size { CGFloat scale = MAX(size.width/image.size.width, size.height/image.size.height); CGFloat width = image.size.width * scale; CGFloat height = image.size.height * scale; CGRect imageRect = CGRectMake((size.width - width)/2.0f, (size.height - height)/2.0f, width, height); UIGraphicsBeginImageContextWithOptions(size, NO, 0); [image drawInRect:imageRect]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

    Minha maneira favorita de fazer isso é com CGImageSourceCreateThumbnailAtIndex (no framework ImageIO). O nome é um pouco enganador.

    Aqui está um trecho de algum código de um aplicativo recente meu.

     CGFloat maxw = // whatever; CGFloat maxh = // whatever; CGImageSourceRef src = NULL; if ([imageSource isKindOfClass:[NSURL class]]) src = CGImageSourceCreateWithURL((__bridge CFURLRef)imageSource, nil); else if ([imageSource isKindOfClass:[NSData class]]) src = CGImageSourceCreateWithData((__bridge CFDataRef)imageSource, nil); // if at double resolution, double the thumbnail size and use double-resolution image CGFloat scale = 1; if ([[UIScreen mainScreen] scale] > 1.0) { scale = 2; maxw *= 2; maxh *= 2; } // load the image at the desired size NSDictionary* d = @{ (id)kCGImageSourceShouldAllowFloat: (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform: (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageAlways: (id)kCFBooleanTrue, (id)kCGImageSourceThumbnailMaxPixelSize: @((int)(maxw > maxh ? maxw : maxh)) }; CGImageRef imref = CGImageSourceCreateThumbnailAtIndex(src, 0, (__bridge CFDictionaryRef)d); if (NULL != src) CFRelease(src); UIImage* im = [UIImage imageWithCGImage:imref scale:scale orientation:UIImageOrientationUp]; if (NULL != imref) CFRelease(imref); 

    Se você estiver usando uma imagem em tamanhos diferentes e redimensionando a cada vez, isso prejudicará o desempenho do aplicativo. A solução é não redimensioná-los basta usar o botão no lugar de imageview. e basta definir a imagem no botão que irá resize automaticamente e você terá um ótimo desempenho.

    Eu também estava redimensionando imagens enquanto colocava no celular, mas meu aplicativo ficava lento Então eu usei Button no lugar de imageview (não redimensionando imagens programaticamente botão está fazendo este trabalho) e está funcionando perfeitamente bem.

      -(UIImage *)scaleImage:(UIImage *)image toSize:. (CGSize)targetSize { //If scaleFactor is not touched, no scaling will occur CGFloat scaleFactor = 1.0; //Deciding which factor to use to scale the image (factor = targetSize / imageSize) if (image.size.width > targetSize.width || image.size.height > targetSize.height || image.size.width == image.size.height) if (!((scaleFactor = (targetSize.width / image.size.width)) > (targetSize.height / image.size.height))) //scale to fit width, or scaleFactor = targetSize.height / image.size.height; // scale to fit heigth. 

    Como o código funcionou perfeitamente no iOS 4, para compatibilidade com versões anteriores, adicionei uma verificação para a versão do SO e para qualquer coisa abaixo de 5.0, o código antigo funcionaria.

     - (UIImage *)resizedImage:(CGSize)newSize interpolationQuality:(CGInterpolationQuality)quality { BOOL drawTransposed; CGAffineTransform transform = CGAffineTransformIdentity; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0) { // Apprently in iOS 5 the image is already correctly rotated, so we don't need to rotate it manually drawTransposed = NO; } else { switch (self.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: drawTransposed = YES; break; default: drawTransposed = NO; } transform = [self transformForOrientation:newSize]; } return [self resizedImage:newSize transform:transform drawTransposed:drawTransposed interpolationQuality:quality]; } 

    Você pode usar isso.

    [m_Image.layer setMinificationFilter:kCAFilterTrilinear];

    Este tópico é antigo, mas é o que eu resolvi ao tentar resolver esse problema. Depois que a imagem é dimensionada, ela não estava sendo exibida corretamente no meu contêiner, embora eu tenha desativado o layout automático. A maneira mais fácil de resolver isso para exibição em uma linha de tabela era pintar a imagem em um plano de fundo branco com tamanho fixo.

    Função auxiliar

     +(UIImage*)scaleMaintainAspectRatio:(UIImage*)sourceImage :(float)i_width :(float)i_height { float newHeight = 0.0; float newWidth = 0.0; float oldWidth = sourceImage.size.width; float widthScaleFactor = i_width / oldWidth; float oldHeight = sourceImage.size.height; float heightScaleFactor = i_height / oldHeight; if (heightScaleFactor > widthScaleFactor) { newHeight = oldHeight * widthScaleFactor; newWidth = sourceImage.size.width * widthScaleFactor; } else { newHeight = sourceImage.size.height * heightScaleFactor; newWidth = oldWidth * heightScaleFactor; } // return image in white rect float cxPad = i_width - newWidth; float cyPad = i_height - newHeight; if (cyPad > 0) { cyPad = cyPad / 2.0; } if (cxPad > 0) { cxPad = cxPad / 2.0; } CGSize size = CGSizeMake(i_width, i_height); UIGraphicsBeginImageContextWithOptions(CGSizeMake(size.width, size.height), YES, 0.0); [[UIColor whiteColor] setFill]; UIRectFill(CGRectMake(0, 0, size.width, size.height)); [sourceImage drawInRect:CGRectMake((int)cxPad, (int)cyPad, newWidth, newHeight)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; // will return scaled image at actual size, not in white rect // UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)); // [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)]; // UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // UIGraphicsEndImageContext(); // return newImage; } 

    Eu chamei isso assim da minha exibição de tabela cellForRowAtIndexPath

      PFFile *childsPicture = [object objectForKey:@"picture"]; [childsPicture getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) { if (!error) { UIImage *largePicture = [UIImage imageWithData:imageData]; UIImage *scaledPicture = [Utility scaleMaintainAspectRatio:largePicture :70.0 :70.0 ]; PFImageView *thumbnailImageView = (PFImageView*)[cell viewWithTag:100]; thumbnailImageView.image = scaledPicture; [self.tableView reloadData]; } }];