Cortar imagem em forma de texto

Eu preciso recortar uma imagem na forma do texto em outra imagem. Eu acho que é melhor mostrado em imagens.

Esta é uma foto de um gato:

Foto de um gato legal

e este é o texto que eu quero cortar:

Texto para cortar a foto do gato

A imagem resultante seria esta:

Recorte resultante da foto do gato

A imagem do texto será sempre preta com um fundo transparente e o recorte resultante também deve ter um plano de fundo transparente. Ambas as imagens de input também serão do mesmo tamanho.

   

Crie uma nova BufferedImage e repita todos os pixels da palavra cat e, se forem pretos, copie os pixels da imagem de gato para a nova imagem.

Aqui está algum código: ( código de trabalho final, suporta anti-alias )

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; } 

Texto gato

 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); } } 

Use o GlyphVector . Use a class Font

 public GlyphVector layoutGlyphVector(FontRenderContext frc, char[] text, int start, int limit, int flags) { 

Você pode obter a Shape do contorno do vetor de glifo pelo resumo público Shape getOutline()

Atribua o contorno Shape como um clipe à sua instância Graphics .

Desenhe a imagem nos charts.

Apenas a forma recortada será preenchida.

Nenhum java aqui, mas as operações de imagem necessárias são fáceis de entender. No Mathematica:

insira a descrição da imagem aqui

Você pode fazer isso em Java com apenas algumas linhas de código fonte, usando o Marvin Framework

insira a descrição da imagem aqui

Código fonte:

 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"); } } 

Primeiro, torne a parte preta da imagem “Cat” transparente. Veja aqui para ajuda com isso. Em seguida, compõe essa imagem sobre a imagem do seu gato favorito (o meu é o Sheeba).

O bom disso é que você pode fazer a imagem de texto transparente uma vez, salvá-la e depois aplicá-la a toda a família e amigos de Sheeba!