【问题标题】:UIImageEffects: white image when Gaussian radius above 280, vImageBoxConvolve_ARGB8888 issue?UIImageEffects:当高斯半径超过 280 时出现白色图像,vImageBoxConvolve_ARGB8888 问题?
【发布时间】:2015-09-20 08:54:08
【问题描述】:

我正在使用 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 大小的内核,因此该部分匹配。

【问题讨论】:

    标签: cocoa-touch graphics uikit gaussian vimage


    【解决方案1】:

    box 和 tent 卷积可能会遇到值模溢出 31 位累加器的问题。然而 255 似乎有点窄。至少对于 255x255 应该还有另外 7 位的动态余量。当然,检查函数返回的错误代码。如果它说一切都很好,那么这似乎是值得的错误。附上一些示例代码,帮助 Apple 重现问题,以帮助确保问题得到修复。

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2021-03-06
      • 2020-04-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2019-05-11
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多