如何使用JAVA模糊图像的一部分

Kar*_*ara 9 java image-processing blur

如何模糊图像的一部分,隐藏一些私人部分,如信用卡信息.

我尝试使用ConvolveOp.class,如:

float[] matrix = new float[400];
for (int i = 0; i < 400; i++)
    matrix[i] = 1.0f/500.0f;

BufferedImage sourceImage =  (BufferedImage) image; ;
BufferedImage destImage = null ;
BufferedImageOp op = new ConvolveOp( new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null );
BufferedImage blurredImage = op.filter(sourceImage, destImage);
Run Code Online (Sandbox Code Playgroud)

它似乎工作,除了图像完全模糊.

Sig*_*uza 1

我不知道这是否可以通过更改矩阵值来完成,但这绝对应该可以通过过滤子图像来实现,因为根据文档BufferedImage.getSubimage()

返回的BufferedImage数据与原始图像共享相同的数据数组。

所以原来的 BufferedImage代码应该改变如下:

BufferedImage image = /* ... */;
BufferedImage subImage = image.getSubimage(10, 20, 30, 40); // x, y, width, height
new ConvolveOp(new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null).filter(subImage, subImage);
Run Code Online (Sandbox Code Playgroud)

不过我没有对此进行测试,我可以想象如果和相同,则filter不会按预期工作,在这种情况下,您可以使用子图像的副本,使用此问题的解决方案:sourcedestination

BufferedImage image = /* ... */;
BufferedImage dest = image.getSubimage(10, 20, 30, 40);  // x, y, width, height
ColorModel cm = dest.getColorModel();
BufferedImage src = new BufferedImage(cm, dest.copyData(dest.getRaster().createCompatibleWritableRaster()), cm.isAlphaPremultiplied(), null).getSubimage(0, 0, dest.getWidth(), dest.getHeight());
new ConvolveOp(new Kernel(20, 20, matrix), ConvolveOp.EDGE_NO_OP, null).filter(src, dest);
Run Code Online (Sandbox Code Playgroud)

之后,继续使用image( not subImage , srcor dest!)