我正在使用 Apple 的UIImageEffects示例中的高斯模糊算法:
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: errors when kernel size > 255。280 的高斯半径大致转换为 260 大小的内核,因此该部分匹配。