我的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;
}
答案 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)
我怀疑“昂贵的无法操作”是虚假的。原因:我在模拟器上得到它,但在设备上不。因此,我认为这是模拟器环境的误导性工具。