Вырезать изображение в виде текста
Мне нужно вырезать изображение в форме текста на другом изображении. Я думаю, что это лучше всего показано на изображениях.
Это фотография кота:
![Photo of a nice cat]()
и это текст, который я хочу вырезать:
![Text to cut out of the cat photo]()
В результате получилось следующее:
![Resulting cut-out of the cat photo]()
Текстовое изображение всегда будет черным с прозрачным фоном, и в результате вырезания также должен быть прозрачный фон. Оба входных изображения также будут иметь одинаковый размер.
Ответы
Ответ 1
Создайте новый BufferedImage и переместите все пиксели слова cat, и если они черные, скопируйте пиксели cat-image в новое изображение.
Вот какой код: (Заключительный рабочий код, поддерживает сглаживание)
public static BufferedImage textEffect(BufferedImage image, BufferedImage text) {
if (image.getWidth() != text.getWidth() ||
image.getHeight() != text.getHeight())
{
throw new IllegalArgumentException("Dimensions are not the same!");
}
BufferedImage img = new BufferedImage(image.getWidth(),
image.getHeight(),
BufferedImage.TYPE_INT_ARGB_PRE);
for (int y = 0; y < image.getHeight(); ++y) {
for (int x = 0; x < image.getWidth(); ++x) {
int textPixel = text.getRGB(x, y);
int textAlpha = (textPixel & 0xFF000000);
int sourceRGB = image.getRGB(x, y);
int newAlpha = (int) (((textAlpha >> 24) * (sourceRGB >> 24)) / 255d);
int imgPixel = (newAlpha << 24) | (sourceRGB & 0x00FFFFFF);
int rgb = imgPixel | textAlpha;
img.setRGB(x, y, rgb);
}
}
return img;
}
Ответ 2
![Cat text]()
import java.awt.*;
import java.awt.font.*;
import java.awt.image.BufferedImage;
import java.awt.geom.Rectangle2D;
import javax.imageio.ImageIO;
import java.net.URL;
import java.io.File;
class PictureText {
public static void main(String[] args) throws Exception {
URL url = new URL("http://i.stack.imgur.com/Nqf3H.jpg");
BufferedImage originalImage = ImageIO.read(url);
final BufferedImage textImage = new BufferedImage(
originalImage.getWidth(),
originalImage.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = textImage.createGraphics();
FontRenderContext frc = g.getFontRenderContext();
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 250);
GlyphVector gv = font.createGlyphVector(frc, "Cat");
Rectangle2D box = gv.getVisualBounds();
int xOff = 25+(int)-box.getX();
int yOff = 80+(int)-box.getY();
Shape shape = gv.getOutline(xOff,yOff);
g.setClip(shape);
g.drawImage(originalImage,0,0,null);
g.setClip(null);
g.setStroke(new BasicStroke(2f));
g.setColor(Color.BLACK);
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.draw(shape);
g.dispose();
File file = new File("cat-text.png");
ImageIO.write(textImage,"png",file);
Desktop.getDesktop().open(file);
}
}
Ответ 3
Используйте GlyphVector
. Используйте класс Font
public GlyphVector layoutGlyphVector(FontRenderContext frc,
char[] text,
int start,
int limit,
int flags) {
Вы можете получить outline Shape
из вектора глифа путем публичного аннотация Shape getOutline()
Назначьте контур Shape
в качестве клипа для вашего экземпляра Graphics
.
Нарисуйте изображение на графике.
Будет заполнена только обрезанная форма.
Ответ 4
Здесь нет java, но необходимые операции с изображениями легко понять. В Mathematica:
![enter image description here]()
Ответ 5
Вы можете сделать это на Java только с несколькими строками исходного кода, используя Marvin Framework
![enter image description here]()
исходный код:
public class CutAndFill {
public static void main(String[] args) {
// 1. Load images
MarvinImage catImage = MarvinImageIO.loadImage("./res/catImage.jpg");
MarvinImage catText = MarvinImageIO.loadImage("./res/catText.png");
// 2. Load plug-in, set parameters and process de image
MarvinImagePlugin combine = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.combine.combineByMask");
combine.setAttribute("combinationImage", catImage);
combine.setAttribute("colorMask", Color.black);
combine.process(catText.clone(), catText);
// 3. Save the output image.
MarvinImageIO.saveImage(catText, "./res/catOut.jpg");
}
}
Ответ 6
Сначала сделайте черную часть изображения "Кота" прозрачной. См. здесь для справки. Затем composite, который изображает изображение вашего любимого кота (мое - Sheeba).
Самое приятное в этом - вы можете сделать прозрачное текстовое изображение один раз, сохранить его, а затем применить его ко всей семье и друзьям Sheeba!