关于cocoa-touch:UIImageEffects:当高斯半径超过280时,vImageBoxConvolve_ARGB8888问题出现白色图像吗?

UIImageEffects: white image when Gaussian radius above 280, vImageBoxConvolve_ARGB8888 issue?

我正在使用Apple的UIImageEffects示例中的高斯模糊算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CGFloat inputRadius = blurRadius * inputImageScale;
if (inputRadius - 2. < __FLT_EPSILON__)
    inputRadius = 2.;
uint32_t radius = floor((inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5) / 2);

radius |= 1; // force radius to be odd so that the three box-blur methodology works.

NSInteger tempBufferSize = vImageBoxConvolve_ARGB8888(inputBuffer, outputBuffer, NULL, 0, 0, radius, radius, NULL, kvImageGetTempBufferSize | kvImageEdgeExtend);
void *tempBuffer = malloc(tempBufferSize);

vImageBoxConvolve_ARGB8888(inputBuffer, outputBuffer, tempBuffer, 0, 0, radius, radius, NULL, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(outputBuffer, inputBuffer, tempBuffer, 0, 0, radius, radius, NULL, kvImageEdgeExtend);
vImageBoxConvolve_ARGB8888(inputBuffer, outputBuffer, tempBuffer, 0, 0, radius, radius, NULL, kvImageEdgeExtend);

free(tempBuffer);

vImage_Buffer *temp = inputBuffer;
inputBuffer = outputBuffer;
outputBuffer = temp;

我也在处理一些相当大的图像。不幸的是,当半径超过280时,无论分辨率如何,模糊的图像都会突然变得几乎完全空白。这里发生了什么? vImageBoxConvolve_ARGB8888是否有未记录的内核宽度/高度限制?还是与根据半径计算框核宽度的方式有关?

编辑:

在这里发现了一个类似的问题:vImageBoxConvolve:内核大小> 255时出错。280的高斯半径粗略地转换为260大小的内核,因此该部分匹配。


箱子和帐篷的卷积可能会陷入一个问题,即以模为单位的值会使31位累加器溢出。但是255似乎有点狭窄。至少应有255x255的剩余7位净空。当然,请检查该函数返回的错误代码。如果说一切都很好,那么这似乎是值得的bug。附加一些示例代码,以帮助Apple重现此问题,以帮助确保已解决问题。