Таким образом, используется следующее:
Итак, начиная с этого ...
Я хочу добавитьэто позади него (но заглядывает)
Первое, что нам нужно сделать, это создать маску на основе «альфа» области, которую мы хотимстать прозрачным.Для этого я использую RadialGradientPaint
, так как он позволяет мне создавать эффект "затухания" по краям.
Теперь я уже сделал всю математику (использовал простой редактор изображений дляотработать), поэтому я знаю, где я хочу, чтобы появилось «отверстие»
BufferedImage city = ImageIO.read(new File("/Users/swhitehead/Downloads/City.jpg"));
BufferedImage mask = new BufferedImage(city.getWidth(), city.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = mask.createGraphics();
Color transparent = new Color(255, 0, 0, 0);
Color fill = Color.RED;
RadialGradientPaint rgp = new RadialGradientPaint(
new Point2D.Double(955, 185),
185,
new float[]{0f, 0.75f, 1f},
new Color[]{transparent, transparent, fill});
g2d.setPaint(rgp);
g2d.fill(new Rectangle(0, 0, mask.getWidth(), mask.getHeight()));
g2d.dispose();
Далее, мы используем AlphaComposite
, чтобы закрасить маску исходным (городским) изображением ...
BufferedImage masked = new BufferedImage(city.getWidth(), city.getHeight(), BufferedImage.TYPE_INT_ARGB);
g2d = masked.createGraphics();
g2d.setColor(Color.RED);
g2d.fillRect(0, 0, masked.getWidth(), masked.getHeight());
g2d.drawImage(city, 0, 0, null);
g2d.setComposite(AlphaComposite.DstAtop);
g2d.drawImage(mask, 0, 0, null);
g2d.dispose();
Это генерирует что-то вроде ...
"Белая" дыра на самом деле прозрачная, просто страница тоже белая: /
Наконец, мы объединяем изображение masked
с фоновым изображением ...
BufferedImage composite = new BufferedImage(city.getWidth(), city.getHeight(), BufferedImage.TYPE_INT_ARGB);
g2d = composite.createGraphics();
g2d.drawImage(background, city.getWidth() - background.getWidth(), 0, null);
g2d.drawImage(masked, 0, 0, null);
g2d.dispose();
, чтобы получить что-то вроде ...
Итак, исходя из вашего описания, я предполагаю, что вы имеете в виду