2

I need to resize more image in one "for" but if I use UIGraphicsGetImageFromCurrentImageContext, I don't have enough memory for more images, because it stay on autorelease and images released when "for" is terminated. I need another method for resize. Any ideas. Thanks

-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
CGSize targetSize = newSize;      
CGSize imageSize = image.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
CGFloat targetWidth = targetSize.width;
CGFloat targetHeight = targetSize.height;
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetWidth;
CGFloat scaledHeight = targetHeight;
CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

if (CGSizeEqualToSize(imageSize, targetSize) == NO) 
{
    CGFloat widthFactor = targetWidth / width;
    CGFloat heightFactor = targetHeight / height;

    if (widthFactor > heightFactor) 
        scaleFactor = widthFactor; // scale to fit height
    else
        scaleFactor = heightFactor; // scale to fit width
    scaledWidth  = width * scaleFactor;
    scaledHeight = height * scaleFactor;

    // center the image
    if (widthFactor > heightFactor)
    {
        thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
    }
    else 
        if (widthFactor < heightFactor)
        {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
}       

UIGraphicsBeginImageContext(targetSize); // this will crop

CGRect thumbnailRect = CGRectZero;
thumbnailRect.origin = thumbnailPoint;
thumbnailRect.size.width  = scaledWidth;
thumbnailRect.size.height = scaledHeight;

[image drawInRect:thumbnailRect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//pop the context to get back to the default
UIGraphicsEndImageContext();

return newImage;
}


-(void)preparePhotosForResolution:(CGSize)resolution {
NSLog(@"Resolution : %f,%f",resolution.width,resolution.height);
NSFileManager *fm = [NSFileManager defaultManager];
NSString *tmpPath = [projectPath stringByAppendingPathComponent:@"temp"];
[fm removeItemAtPath:tmpPath error:nil];
[fm createDirectoryAtPath:tmpPath withIntermediateDirectories:YES attributes:nil error:nil];
for (int i = 0; i < [sortArray count]; i++) {
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:[projectPath stringByAppendingPathComponent:[sortArray objectAtIndex:i]]];
    UIImage *newImage = [self imageWithImage:image scaledToSize:resolution];
    [image release];
    NSData *imgData = UIImagePNGRepresentation(newImage);
    [fm createFileAtPath:[tmpPath stringByAppendingPathComponent:[sortArray objectAtIndex:i]] contents:imgData attributes:nil];
}
}
Igor Bidiniuc
  • 1,540
  • 1
  • 16
  • 27
  • 2
    According to Google Translate, Andrew's comment is "Bai you are bald, so you do not know answer to question". In the meantime, Igor, can you show the code that you use to resize your images? That might help me or anyone else to come up with an answer to your image resizing problem. – Michael Dautermann Feb 02 '12 at 16:33
  • exactly translate is "Hey, you are skin, so you don't know answer to question" ;) – Igor Bidiniuc Feb 02 '12 at 17:08
  • 2
    @IgorBidiniuc Please take a look here: http://stackoverflow.com/questions/5860215/resizing-a-uiimage-without-loading-it-entirely-into-memory – Costique Feb 02 '12 at 17:20
  • it's good but this is for thumbnail... – Igor Bidiniuc Feb 06 '12 at 15:03

2 Answers2

3
    CIFilter *filter = [CIFilter filterWithName:@"CILanczosScaleTransform"];
    [filter setValue:newImage forKey:@"inputImage"];
    [filter setValue:@(scale) forKey:@"inputScale"];
    [filter setValue:@1.0 forKey:@"inputAspectRatio"];
    newImage = filter.outputImage;
charvel
  • 221
  • 2
  • 5
-1

With above objective-c code in swift.

inputImage = CIImage
inputScale       =  targetSize.width / originalSize.width
inputAspectRatio =  targetSize.width / (originalSize.width * resizeRatio)


    let resizeFilter = CIFilter(name: "CILanczosScaleTransform")
    resizeFilter?.setValue(inputImage, forKey: "inputImage")
    resizeFilter?.setValue(inputScale, forKey: "inputScale")
    resizeFilter?.setValue(inputAspectRatio, forKey: "inputAspectRatio")
    
    let outputImage = resizeFilter?.outputImage
Abdul Jr.
  • 1
  • 1