“执行昂贵的无拆卸操作!” - 它是什么,以及如何解决它?

时间:2011-11-17 19:09:24

标签: ios ios5 core-image

我的Core Filters测试应用程序的调试控制台显示以下消息:

  

CGImageRef 0x7a0e890具有行字节填充。执行昂贵的卸载操作!

我无法在标题或Google搜索中找到该确切消息(减去指针信息)的匹配。

我的问题是(1)这意味着什么;(2)我如何纠正这种情况?

以下是我如何使用CIFilter生成过滤后的UIImage的示例。

- (UIImage*)sepia
{    
    CIImage *beginImage = [CIImage imageWithCGImage:[self CGImage]];
    CIContext *context = [CIContext contextWithOptions:nil];

    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];
    CIImage *outputImage = [filter outputImage];

    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];

    self = newImg;

    CGImageRelease(cgimg);
    return self;
}

3 个答案:

答案 0 :(得分:4)

字节填充是在每个图像行的末尾添加的额外字节,以确保每行在内存中的2 ^ n字节上开始。这会以图像大小为代价增加内存访问性能。如果比较CGImageGetBytesPerRow的结果和从图像尺寸和每像素字节数计算的每行预期字节数,可以检查这个。

至于如何纠正unpadding - 你需要确切地找到触发unpadding的操作并从那里取出它。 Unpadding是昂贵的,因为基本上整个图像内存需要被移动以消除所有行尾间隙。

答案 1 :(得分:1)

我会写评论,但由于我的声誉很低,我不能这样做,我会在这里作为答案发布:

我遇到了同样的错误,并试图通过使用Thuggish Nuggets的建议来修复它。原来它是正确的方法,但图像大小必须是8的众多。我只是将宽度与8的众多对齐,我不知道自从图像I以来高度是否也必须是8的高度不管怎样,测试这种方法是二次方的。

这是(可能不是非常有效)算法,为您提供有关如何计算所需大小的基本知识:

UIImage *image = ...;
CGSize targetSize = image.frame.size; //e.g. 51 x 51
double aspectRatio = targetSize.width / targetSize.height;
targetSize.width = targetSize.width + 8 - ((int)targetSize.width % 8);
targetSize.height = targetSize.width / aspectRatio;

答案 2 :(得分:0)

我怀疑“昂贵的无法操作”是虚假的。原因:我在模拟器上得到它,但在设备上。因此,我认为这是模拟器环境的误导性工具。