Découper une image en forme de texte

Je dois découper une image dans la forme du texte dans une autre image. Je pense que c’est mieux montré dans les images.

Ceci est une photo d’un chat:

Photo d'un beau chat

et voici le texte que je souhaite découper:

Texte à découper sur la photo du chat

L’image résultante serait la suivante:

Découpage résultant de la photo du chat

L’image de texte sera toujours noire avec un arrière-plan transparent et la découpe résultante devrait également avoir un arrière-plan transparent. Les deux images d’entrée auront également la même taille.

Créez un nouveau BufferedImage et parcourez tous les pixels du mot cat. S’ils sont noirs, copiez les pixels de l’image du chat dans la nouvelle image.

Voici un code: ( Code de travail final, prend en charge les 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; } 

Texte de chat

 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(Ssortingng[] 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); } } 

Utilisez GlyphVector . Utiliser la classe de Font

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

Vous pouvez obtenir le contour Shape from glyph vector par résumé public Shape getOutline()

Atsortingbuez le contour Shape tant que clip à votre instance Graphics .

Dessine l’image sur les graphiques.

Seule la forme coupée sera remplie.

Pas de java ici, mais les opérations d’image nécessaires sont faciles à comprendre. Dans Mathematica:

entrer la description de l'image ici

Vous pouvez le faire en Java avec seulement quelques lignes de code source, en utilisant Marvin Framework

entrer la description de l'image ici

code source:

 public class CutAndFill { public static void main(Ssortingng[] 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.setAtsortingbute("combinationImage", catImage); combine.setAtsortingbute("colorMask", Color.black); combine.process(catText.clone(), catText); // 3. Save the output image. MarvinImageIO.saveImage(catText, "./res/catOut.jpg"); } } 

Tout d’abord, rendez transparente la partie noire de l’image “Cat”. Voir ici pour l’aide avec ceci. Ensuite, composez cette image sur la photo de votre chat préféré (la mienne est Sheeba).

La bonne chose à ce sujet est que vous pouvez créer une image de texte transparente une fois, l’enregistrer, puis l’appliquer à toute la famille et aux amis de Sheeba!