【问题标题】:Cut out image in shape of text剪出文字形状的图片
【发布时间】:2011-09-11 19:28:56
【问题描述】:

我需要在另一个图像中以文本的形状剪切一个图像。我认为最好用图片来展示。

这是一张猫的照片:

这是我要删掉的文字:

生成的图像是这样的:

文本图像将始终为黑色并带有透明背景,并且生成的剪切图也应具有透明背景。两个输入图像的大小也将相同。

【问题讨论】:

  • 随便。猫?立即 +1!
  • 你填满了内部的“a”孔。这是故意的吗?
  • @belisarius 很好发现 - 不,那不是故意的 ;)
  • 如果你有一个图像和一个文本不是更好吗? (只是问)

标签: java image image-processing


【解决方案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;
}

【讨论】:

  • 如何遍历单词 cat 的所有像素?如果这个词是狗呢?来自 OP - 文本始终为黑色,所以只需将所有黑色像素替换为其他图像中的相应像素?
  • @Lobo 是的,这就是他的建议。
  • 一个小建议:在计算newAlpha时不要转换为double,而是在乘法之后将除法移到末尾。
  • @Mark:谢谢,确实简洁了一些。
【解决方案2】:

使用GlyphVector。使用Font

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

您可以通过公共抽象形状getOutline()从字形矢量中获取轮廓Shape

将轮廓 Shape 作为剪辑分配给您的 Graphics 实例。

在图形上绘制图像。

只会填充剪裁的形状。

【讨论】:

    【解决方案3】:

    这里没有java,但是需要的图片操作很容易理解。在 Mathematica 中:

    【讨论】:

    • 可能 OP 想首先创建一个这样的方法。
    【解决方案4】:

    首先,使“猫”图像的黑色部分透明。请参阅here 以获得帮助。然后,composite 在你最喜欢的猫(我的是 Sheeba)的照片上显示该图像。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您可以在 Java 中使用 Marvin Framework 几行源代码来完成此操作

        源代码:

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

        【讨论】:

          猜你喜欢
          • 2013-02-28
          • 1970-01-01
          • 2012-10-29
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          • 2017-06-14
          • 2022-01-14
          • 2015-01-28
          相关资源
          最近更新 更多