Мне нужно вырезать изображение в форме текста на другом изображении. Я думаю, что это лучше всего показать на изображениях.
Это фотография кошки:
и это текст, который я хочу вырезать:
Результирующее изображение будет таким:
Текстовое изображение всегда будет черным на прозрачном фоне, и результирующий вырез тоже должен иметь прозрачный фон. Оба входных изображения также будут одинакового размера.
Создайте новое BufferedImage и выполните итерацию по всем пикселям word cat, и если они черные, скопируйте пиксели изображения кошки в новое изображение.
Вот некоторый код: (Окончательный рабочий код, поддерживает сглаживание псевдонимов)
publicstatic BufferedImage textEffect(BufferedImage image, BufferedImage text) { if (image.getWidth() != text.getWidth() || image.getHeight() != text.getHeight()) { thrownewIllegalArgumentException("Dimensions are not the same!"); } BufferedImageimg=newBufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
for (inty=0; y < image.getHeight(); ++y) { for (intx=0; x < image.getWidth(); ++x) { inttextPixel= text.getRGB(x, y); inttextAlpha= (textPixel & 0xFF000000); intsourceRGB= image.getRGB(x, y); intnewAlpha= (int) (((textAlpha >> 24) * (sourceRGB >> 24)) / 255d); intimgPixel= (newAlpha << 24) | (sourceRGB & 0x00FFFFFF); intrgb= imgPixel | textAlpha; img.setRGB(x, y, rgb);
} } return img; }
Ответ 3
Использовать GlyphVector. Использовать Font класс
public GlyphVector layoutGlyphVector(FontRenderContext frc, char[] text, int start, int limit, int flags) {
Вы можете получить контур Shape из векторного глифа с помощью общедоступной абстрактной формы getOutline()
Назначьте контур Shape в качестве клипа вашему Graphics экземпляру.
Нарисуйте изображение на графике.
Будет заполнена только обрезанная форма.
Ответ 4
Здесь нет Java, но необходимые операции с изображением понятны. В Mathematica: