【问题标题】:"Performing a costly unpadding operation!" -- what is it, and how to fix it?“执行代价高昂的取消填充操作!” - 它是什么,以及如何解决它?
【发布时间】:2011-12-31 15:38:02
【问题描述】:

我的 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;
}

【问题讨论】:

  • 我从未收到对我的问题的真正答案——我的情况是特定于 iOS 的,我提供了导致问题的代码但没有收到解决方案。罗宾是唯一一个提供任何帮助的人,对这个问题没有表现出任何兴趣。我会提供赏金,但我看到很多赏金没有足够的答案,所以不值得。
  • 我们今天刚开始遇到这个问题,我们也无法追踪它。
  • @ThuggishNuggets —如果您发现任何新信息,请告诉我
  • 我们通过确保图像的宽度是 4 的倍数来解决这个问题,考虑到下面@Robin 的回答,这很有意义。我对它的工作原理的理解是,一行中的字节数必须能被 2 的幂整除。这在我们的例子中有效,因为我们的像素格式是 RGBA8888 或每个像素 4 个字节。通过将我们的宽度限制为 4 的倍数,我们确保图像宽度的每 4 个像素增量向行中添加 16 个字节,这使得行中的字节数始终可被 16 整除,即 2^4(可被幂2)。

标签: ios ios5 core-image


【解决方案1】:

我怀疑“代价高昂的取消填充操作”是假的。原因:我在模拟器上得到它,但在设备上没有。因此,我认为这是 Simulator 环境的误导性工件。

【讨论】:

  • 我的帖子是在大约 16 个月前创建的(所以我不清楚细节是什么),但我感觉我说你很可能是对的。哪个设备,哪个操作系统版本?我当时使用的是 iOS 5。
【解决方案2】:

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

我刚刚遇到了同样的错误,并尝试使用 Thuggish Nuggets 的建议来修复它。原来这是正确的方法,但是图像大小必须是 8 的倍数。我只是将宽度与 8 的倍数对齐,我不知道高度是否也必须是 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;

【讨论】:

    【解决方案3】:

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

    至于如何纠正取消填充 - 您需要准确找到触发取消填充的操作并从那里获取。取消填充很昂贵,因为基本上整个图像内存都需要重新排列以消除所有行尾间隙。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2021-06-25
      • 2012-02-16
      • 1970-01-01
      • 2020-08-06
      • 2013-08-04
      相关资源
      最近更新 更多