问题描述
我需要一个建议:我想知道,一般来说,获得应用于 BufferedImage 的“渐变框架效果”的算法,操作图像的 Raster(WritableRaster 类和 setSample 方法)。例如,我有这张图片:
输入:
我想得到这个:
渐变框架效果:
我该如何继续?
解决方法
您可以使用 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)));
}
}