处理Core Image过滤器中的> 1.4MB大小的图像时收到内存警告?

时间:2012-12-12 16:33:44

标签: iphone ios5 image-processing uiimage core-image

在我的应用程序中,我正在使用核心图像过滤器 以下代码我用于

我的代码:

- (UIImage*)applyRGBWithRed:(float)red withGreen:(float)green withBlue:(float)blue
{
        ciimage=[CIImage imageWithCGImage:self.CGImage];
       // Make the filter
    CIFilter *colorMatrixFilter = [CIFilter filterWithName:@"CIColorMatrix"]; // 2
    [colorMatrixFilter setDefaults]; // 3
    [colorMatrixFilter setValue:ciimage forKey:kCIInputImageKey]; // 4
    [colorMatrixFilter setValue:[CIVector vectorWithX:red Y:0 Z:0 W:0] forKey:@"inputRVector"]; // 5
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:green Z:0 W:0] forKey:@"inputGVector"]; // 6
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:blue W:0] forKey:@"inputBVector"]; // 7
    [colorMatrixFilter setValue:[CIVector vectorWithX:0 Y:0 Z:0 W:1] forKey:@"inputAVector"]; // 8z


    // Get the output image recipe
    CIImage *outputImage = [colorMatrixFilter outputImage];  // 9

    // Create the context and instruct CoreImage to draw the output image recipe into a CGImage
    context = [CIContext contextWithOptions:nil];
    CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; // 10
    self.saveImage=[UIImage imageWithCGImage:cgimg];
    CGImageRelease(cgimg);
    return self.saveImage;
  }

当我处理大图像[即大于1.4 MB大小]时,它会给出内存警告并使应用程序崩溃。

为什么会导致崩溃? 我该如何处理这种情况?

任何建议或想法都非常高兴。我打了一个多星期......

提前致谢....

在pro-filer中运行时,它提供了以下输出 enter image description here

1 个答案:

答案 0 :(得分:2)

也许您可以将大图像“拆分”成更小的部分,在每个图像上应用文件管理器,然后将它们组合回大图像?

UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; // The Big image
NSMutableArray *croppedImages = [NSMutableArray array];
CGSize imageSize = image.size;
CGSize cropSize = CGSizeMake(500, 500); // The size of each "small image"
// Step 1: Produce the small images and save to disk
for (CGFloat x = 0; x < imageSize.width; x += cropSize.width)
{
    for (CGFloat y = 0; y < imageSize.height; y += cropSize.height)
    {
        UIGraphicsBeginImageContext(cropSize);
        [image drawAtPoint:CGPointMake(-x, -y)];
        UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"cropped_%f_%f.png",x,y]];
        NSData *imageData = UIImagePNGRepresentation(cropped);
        [imageData writeToFile:path atomically:YES];
        imageData = nil;

        [croppedImages addObject:path];
    }
}
// Release the big image (assume we are using ARC)
image = nil;
// Step 2: Apply the filter to the small images and re-save them
for (NSString *path in croppedImages)
{
    UIImage *img = [UIImage imageWithContentsOfFile:path];

    // Apply your filter to img here

    NSData *imageData = UIImagePNGRepresentation(img);
    [imageData writeToFile:path atomically:YES];
    imageData = nil;
}
// Step 3: Combine the small images back to a big one
UIGraphicsBeginImageContext(imageSize);
for (CGFloat x = 0; x < imageSize.width; x += cropSize.width)
{
    for (CGFloat y = 0; y < imageSize.height; y += cropSize.height)
    {
        NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"cropped_%f_%f.png",x,y]];
        UIImage *img = [UIImage imageWithContentsOfFile:path];

        [img drawAtPoint:CGPointMake(x, y)];
    }
}
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Step 4: Optionally remove the temporary files
for (NSString *path in croppedImages)
{
    [[NSFileManager defaultManager] removeItemAtPath:path error:NULL];
}

显然,它会很慢。