“执行昂贵的无压印操作!” – 这是什么,以及如何解决它?

我的核心filtertesting应用程序的debugging控制台显示此消息:

CGImageRef 0x7a0e890有行字节填充。 执行代价高昂的无压缩操作!

我无法在标题或Googlesearch中find确切消息(减去指针信息)的命中。

我的问题是(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; } 

字节填充是将额外的字节添加到每个图像行的末尾,以确保每行在内存中以2 ^ n个字节的倍数开始。 这会以牺牲图像大小为代价来提高内存访问性能。 如果比较CGImageGetBytesPerRow的结果和根据图像尺寸和每像素字节计算出的每行预期字节数,则可以检查这一点。

至于如何纠正未压缩 – 你需要确切地find哪个操作触发unpadding并从那里拿走。 Unpadding是昂贵的,因为基本上整个图像内存需要洗牌,以消除所有的行尾差距。

我会写一个评论,但由于我不能做到这一点,因为我有很低的名誉,我会在这里作为答复张贴:

我只是有同样的错误,并尝试使用Thuggish Nuggets的build议来解决这个问题。 原来,这是正确的方法,但是图像的大小必须是8的数量。我只是将宽度与8的倍数alignment,我不知道高度是否也必须是8的倍数,因为图像I反正用二次方法testing了这个方法。

这里(可能不是非常有效的)algorithm给你一个关于如何计算所需的大小的基本思想:

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

我怀疑“昂贵的无纸化作业”是假的。 原因:我在模拟器上,但没有在设备上。 因此,我认为这是模拟器环境的一个误导性的人为因素。