Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios &引用;执行代价高昂的添加操作&“——”它是什么?如何修复它?_Ios_Ios5_Core Image - Fatal编程技术网

Ios &引用;执行代价高昂的添加操作&“——”它是什么?如何修复它?

Ios &引用;执行代价高昂的添加操作&“——”它是什么?如何修复它?,ios,ios5,core-image,Ios,Ios5,Core Image,my Core Filters测试应用程序的调试控制台显示以下消息: CGImageRef 0x7a0e890具有行字节填充。执行代价高昂的添加操作 我在标题或谷歌搜索中找不到确切的消息(减去指针信息) 我的问题是(1)这意味着什么,(2)我如何纠正这种情况 以下是我如何使用CIFilter生成已过滤UIImage的示例 - (UIImage*)sepia { CIImage *beginImage = [CIImage imageWithCGImage:[self CGImag

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

CGImageRef 0x7a0e890具有行字节填充。执行代价高昂的添加操作

我在标题或谷歌搜索中找不到确切的消息(减去指针信息)

我的问题是(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的结果与根据图像尺寸和每像素字节计算的预期每行字节数进行比较,则可以检查这一点


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

我会写一条评论,但由于声誉不好,我无法这样做,因此我将在这里作为答案发布:

我只是犯了同样的错误,并试图用暴徒的建议来纠正它。事实证明这是正确的方法,但是图像大小必须是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;

我怀疑“代价高昂的行动”是假的。原因:我在模拟器上得到它,但在设备上没有。因此,我认为这是模拟器环境的一个误导性产物。

我从未收到我的问题的真实答案。我的情况特定于iOS,我提供了导致问题的代码,但没有收到解决方案。罗宾是唯一一个提供任何帮助的人,对这个问题没有任何兴趣。我愿意提供悬赏,但我看到很多悬赏都没有得到充分的答复,所以不值得。我们今天才开始遇到这个问题,我们也很难找到它。@ThuggishNuggets-如果您发现任何新信息,请告诉我,我们通过确保图像宽度为4的倍数来修复此问题考虑到下面@Robin的回答,这是有道理的。我对其工作原理的理解是,行中的字节数必须可以被2的幂整除。这在我们的例子中是有效的,因为我们的像素格式是RGBA8888或每像素4字节。通过将我们的宽度限制为4的倍数,我们确保图像宽度每增加4个像素,就向行中添加16个字节,这使得行中的字节数总是可以被16整除,16等于2^4(可以被2的幂整除)。我的帖子是在大约16个月前创建的(因此我对细节不太清楚)但我觉得我说你很可能是对的。哪个设备,哪个操作系统版本?当时我正在使用iOS5。