当前位置: 首页 > 知识库问答 >
问题:

Java模糊图像

晁砚
2023-03-14

我在试着模糊图像

   int radius = 11;
    int size = radius * 2 + 1;
    float weight = 1.0f / (size * size);
    float[] data = new float[size * size];

    for (int i = 0; i < data.length; i++) {
        data[i] = weight;
    }

    Kernel kernel = new Kernel(size, size, data);
    ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
    //tbi is BufferedImage
    BufferedImage i = op.filter(tbi, null);

它会模糊图像,但不是图像的所有部分。

我所缺少的地方,这样它就会模糊完整的图像。没有任何路径。

共有2个答案

申屠秦斩
2023-03-14

这是因为您在此行中使用了convolveop.edge_no_op:

ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);

API文档说:

源图像边缘的像素被复制到目标中的相应像素,而不进行修改。

尝试edge_zero_fill-这将给您黑色边框。

你也可以试着把模糊后的边缘剪掉。

它为什么不能做边的原因与算法的工作方式有关。

尉迟彬
2023-03-14

标准的Javaconvolveop只有两个选项edge_zero_filledge_no_op。您需要的是JAI等价物(ConvolveDescriptor)中的选项,它是edge_reflect(或者edge_wrap,如果您需要重复模式)。

如果您不想使用JAI,您可以自己实现这一点,将您的图像复制到一个更大的图像,拉伸或包装边缘,应用卷积op,然后切断边缘(类似于@halex在评论部分发布的文章中“处理边缘”部分描述的技术,但根据那篇文章,您也可以让边缘保持透明)。

为了简单起见,您可以使用我的实现convolvewithedgeop,它执行上述操作(BSD许可)。

代码将与您最初的代码相似:

// ...kernel setup as before...
Kernel kernel = new Kernel(size, size, data);
BufferedImageOp op = new ConvolveWithEdgeOp(kernel, ConvolveOp.EDGE_REFLECT, null);

BufferedImage blurred = op.filter(original, null);

该筛选器应该与任何其他BufferedImageOP一样工作,并且应该与任何BufferedImage一起工作。

 类似资料:
  • 问题内容: 我正在尝试在Java游戏中实现模糊机制。如何在运行时创建模糊效果? 问题答案: 请参阅/ Google“卷积滤镜”,这是一种根据周围像素值更改像素值的方法。因此,除了模糊之外,您还可以进行图像锐化和寻线。

  • 安卓的模糊视图 > 原文链接 : A Blurring View for Android 作者 : Jun Luo 译者 : lvtea0105 校对者: bboyfeiyu 校对者: chaossss 状态 : 校对完成 模糊效果可以生动地表现出内容的层次感,当使用者关注重点内容,即便在模糊表面之下发生视差效果或者动态改变,也能够保持当前背景。 在IOS设备中,我们首先构造一个UIVisualE

  • 我试图添加一个启动器图标到我的Android应用程序,但似乎与安装应用程序的分辨率有问题。我使用的设备有一个XHDPI屏幕,所以我用96x96(px)图像进行测试。我在Android Studio中使用Image Asset生成默认图标: 您可以注意到图像有点模糊,因为它已经调整了大小。它发生在我制作的每个图标上。发生了什么事?我正在使用MIUI,尽管它似乎不会影响到其他图标。 编辑:我的启动器图

  • 问题内容: 我对Java的 varargs 方法有些困惑: 当我尝试在不传递任何参数的情况下进行调用时,将调用方法的版本。我不明白为什么;通常,编译器必须引发错误。 相比之下,当我尝试不带任何参数的情况下,以下代码会生成编译器错误: 问题答案: 这里适用的一般规则是:如果一个方法签名严格比另一个方法签名 更具体 ,则Java选择它时不会出错。 从直觉上讲,如果您可以完全删除一个方法签名,则该方法签

  • 然后,我根据页面大小与图像大小计算缩放的维度,返回:java.awt.dimension[width=562,height=792]我使用下面的代码来计算缩放的维度: 为了实际执行图像缩放,我使用image Scalr API: 我的问题是我做错了什么?当缩放到较小的尺寸时,大的图像不应该被模糊。这与PDF页面的分辨率/大小有关吗?