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:
et voici le texte que je souhaite découper:
L’image résultante serait la suivante:
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; }
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:
Vous pouvez le faire en Java avec seulement quelques lignes de code source, en utilisant Marvin Framework
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!