Как создать прозрачную фигуру на изображении - PullRequest
0 голосов
/ 05 июня 2018

У меня есть изображение. Теперь я хочу создать прозрачную фигуру, чтобы я мог поместить другое изображение в эту форму.

Я хочу добиться чего-то подобного

enter image description here

Есть ли способ сделать это программно в Java или Python.Если нет, как я могу сделать это вручную.

У меня есть среда linux и некоторый редактор изображений, но я не могу сделать это даже вручную.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Таким образом, используется следующее:

Итак, начиная с этого ...

Foreground

Я хочу добавитьэто позади него (но заглядывает)

Peek-a-Boo

Первое, что нам нужно сделать, это создать маску на основе «альфа» области, которую мы хотимстать прозрачным.Для этого я использую 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

"Белая" дыра на самом деле прозрачная, просто страница тоже белая: /

Наконец, мы объединяем изображение 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();

, чтобы получить что-то вроде ...

He's always watching

Итак, исходя из вашего описания, я предполагаю, что вы имеете в виду

0 голосов
/ 05 июня 2018

С здесь :

# import the necessary packages
from __future__ import print_function
import numpy as np
import cv2

# load the image
image = cv2.imread("pic.jpg")

# loop over the alpha transparency values
for alpha in np.arange(0, 1.1, 0.1)[::-1]:
    # create two copies of the original image -- one for
    # the overlay and one for the final output image
    overlay = image.copy()
    output = image.copy()

    # draw a red rectangle surrounding Adrian in the image
    # along with the text "PyImageSearch" at the top-left
    # corner
    cv2.rectangle(overlay, (420, 205), (595, 385),
        (0, 0, 255), -1)
    cv2.putText(overlay, "PyImageSearch: alpha={}".format(alpha),
        (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 3)
# apply the overlay
    cv2.addWeighted(overlay, alpha, output, 1 - alpha,
        0, output)
# show the output image
    print("alpha={}, beta={}".format(alpha, 1 - alpha))
    cv2.imshow("Output", output)
    cv2.waitKey(0)
...