剪切图像的文字形状

我需要在另一个图像中以文本的形式剪切图像。 我认为这是最好的图像显示。

这是一只猫的照片:

一只漂亮的猫的照片

这是我想要删除的文本:

文字切出的猫照片

由此产生的图像将是这样的:

从而导致猫照片的切出

文字图像将始终是黑色的,透明的背景,所产生的剪切也应该有一个透明的背景。 这两个输入图像也将是相同的大小。

创建一个新的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; } 

猫文本

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

使用GlyphVector 。 使用Font

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

您可以通过公共抽象Shape Shape getOutline()

将大纲Shape作为剪辑指定给Graphics实例。

在图形上绘制图像。

只有剪裁的形状将被填充。

这里没有Java,但所需的图像操作很容易理解。 在Mathematica中:

在这里输入图像描述

你可以使用Marvin框架 ,只用几行代码就可以完成

在这里输入图像描述

源代码:

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

首先,使“猫”图像的黑色部分透明。 在这里看到这个帮助。 然后,把你最喜欢的猫的照片(我的是Sheeba) 复合成图像。

关于这一点的好处是你可以制作透明文本图像一次,保存,然后将其应用到Sheeba的所有家人和朋友!