通过 WritableRaster 类和 setSample 方法将 Java“渐变框架效果”转换为 BufferedImage

问题描述

我需要一个建议:我想知道,一般来说,获得应用于 BufferedImage 的“渐变框架效果”的算法,操作图像的 Raster(WritableRaster 类和 setSample 方法)。例如,我有这张图片

输入:

https://i.stack.imgur.com/GpkSb.jpg

我想得到这个:

渐变框架效果

https://i.stack.imgur.com/nD6sX.jpg

我该如何继续?

解决方法

您可以使用 AlphaComposite 以适当的透明度/不透明度在原始图像的顶部进行绘制,从而为边框提供不同的效果。

RadialGradientPaint 将通过在中心使用完全透明并逐渐过渡到黑色边框来为您提供聚光灯效果。

以下内容将在图像周围绘制黑色边框:

import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import javax.imageio.*;
import java.awt.geom.*;

public class ClipImageBorder
{
    public static void main(String[] args) throws Exception
    {
        BufferedImage image = ImageIO.read(new File("mickeyred.jpg"));

        //  Set up the properties of the RadialGradientPaint

        int border = 20;
        int width = image.getWidth() - (2 * border);
        int height = image.getHeight() - (2 * border);
        Rectangle2D  bounds = new Rectangle2D.Double(border,border,width,height);

        float[] dist = {0.0f,0.8f,1.0f};
        Color transparent = new Color(0.0f,0.0f,0.0f);
        Color[] colors = {transparent,transparent,Color.BLACK};
        RadialGradientPaint p = new RadialGradientPaint(bounds,dist,colors,MultipleGradientPaint.CycleMethod.NO_CYCLE);

        //  Use the AlphaComposite to paint the border

        Graphics2D g2 = image.createGraphics();
        g2.setPaint(p);
        g2.setComposite( AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.0f) );
        g2.fillRect(0,image.getWidth(),image.getHeight());
        g2.dispose();

        JOptionPane.showMessageDialog(null,new JLabel(new ImageIcon(image)));
    }
}