“执行昂贵的无压印操作!” – 这是什么,以及如何解决它?
我的核心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;
我怀疑“昂贵的无纸化作业”是假的。 原因:我在模拟器上,但没有在设备上。 因此,我认为这是模拟器环境的一个误导性的人为因素。
- 有没有办法创build一个SKSpriteNode的CGPath匹配轮廓?
- 用于Core Image的CIGaussianGradientfilter的示例
- 在iOS中使用CIEdgeWorkfilter
- MonoTouch中的CoreImage不会从有效资产中返回有效的图像
- 使用iOS 5 AV Foundation和core-image实时确定一张纸的边angular
- CGImageDestinationFinalize或UIImageJPEGRepresentation – 在IOS 10上保存大文件时发生崩溃
- 以正确的方向保存图像 – Swift&Core Image
- 什么是“需要一个swizzler,使RGB8可以阅读”关于该核心图像给iOS9?
- 如何将CAShapeLayer坐标转换为CIRectangleFeature以进行手动裁剪