在我的应用程序中,我正在使用核心图像过滤器 以下代码我用于
我的代码:
- (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中运行时,它提供了以下输出
答案 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];
}
显然,它会很慢。