将文本添加到图像中

在图像上写入文本的 .NET API 解决方案

 

Aspose.Font for .NET 是为在 .NET 应用程序中使用字体的开发人员提供的综合解决方案。它简化了为不同目的加载、编辑、转换和使用字体等任务。这样的目的之一就是文本渲染。该解决方案提供了一种使用特定字体在图像上呈现文本的自定义方式,考虑字距调整并提供对背景颜色、文本颜色和文本大小等各个方面的控制。

在许多应用程序中,向图像添加文本是一项有用的功能,可满足各种目的。以下是一些类别:

  • 照片编辑应用程序 - Canva、Adobe Express 和 PicLab 等允许您以各种方式编辑照片,添加文本是核心功能。
  • 社交媒体应用程序 - Instagram 和 Facebook 等具有内置的照片文本编辑工具。这样您就可以在共享之前直接在应用程序内添加标题、引言或其他消息。
  • 如果您要创建更复杂的设计,例如传单、海报或演示文稿,图形设计应用程序(例如 Photoshop 或 GIMP)可提供高级文本编辑功能。这些允许精确控制文本位置、格式和效果。
  • 模因文化因图像上的文字幽默而蓬勃发展。 meme 创建应用程序(如 Imgflip 或 Meme Generator)提供了用于创建有趣或带标题图像的模板和编辑工具。
  • 为营销活动创建引人注目的视觉效果通常涉及向图像添加文本。 营销和广告工具(例如 Spark Post 或 Stencil)可让您设计有效融入文本的社交媒体帖子、传单或广告。
  • 教育应用程序 - 使用图像上的文本来创建信息图表、学习指南或其他视觉学习材料。

向图像添加文本的原因有很多,例如向图像添加上下文、吸引用户的注意力、创建消息等。使用 Aspose.Font,可以在基于 C# 代码的应用程序中轻松实现此功能。

要运行您需要的示例:

  • Aspose.Font for .NET API 是一个功能丰富、强大且易于使用的 C# 平台文档操作和转换 API。

  • 打开 NuGet 包管理器,搜索 Aspose.Font 并安装。您还可以从包管理器控制台使用以下命令。

Package Manager Console Command


    PM> Install-Package Aspose.Font

C# 在图像上显示文本的步骤:

提供的代码片段定义了一个名为 CustomDrawText 的函数,该函数采用各种参数来使用指定字体在位图上呈现文本。以下是功能的细分:

  1. 检索字形的 ID 以表示字体内的特定字符形状。
  2. 设置输出位图的分辨率。
  3. 使用提供的画笔填充位图的背景。
  4. 设置抗锯齿功能以实现更平滑的文本渲染并初始化字形定位变量。
  5. 使用渲染器使用指定的字形渲染文本。
  6. 将最终的位图与绘制的文本保存到指定文件中。

在图像上写入文本的 C# 代码

    public static void CustomDrawText(string text, IFont font, double fontSize, Brush backgroundBrush, Brush textBrush, string outFile, Bitmap bitmap, double kerningCoefficient = 1, double coordinateX = 0, double coordinateY = 0)
    {
        //Get glyph identifiers for every symbol in the text line
        GlyphId[] gids = new GlyphId[text.Length];

        for (int i = 0; i < text.Length; i++)
            gids[i] = font.Encoding.DecodeToGid(text[i]);

        // Set common drawing settings
        double dpi = 300;
        double resolutionCorrection = dpi / 72; // 72 is font's internal dpi

        // Prepare the output bitmap                
        Bitmap outBitmap = bitmap;

        outBitmap.SetResolution((float)dpi, (float)dpi);

        Graphics outGraphics = Graphics.FromImage(outBitmap);
        outGraphics.FillRectangle(backgroundBrush, 0, 0, outBitmap.Width, outBitmap.Height);
        outGraphics.SmoothingMode = SmoothingMode.HighQuality;

        //Declare coordinate variables and the previous gid
        GlyphId previousGid = null;
        double glyphXCoordinate = coordinateX;
        double glyphYCoordinate = coordinateY;

        glyphYCoordinate += fontSize * resolutionCorrection;

        //The loop paints every glyph in gids
        foreach (GlyphId gid in gids)
        {
            // if the font contains the gid
            if (gid != null)
            {
                Glyph glyph = font.GlyphAccessor.GetGlyphById(gid);
                if (glyph == null)
                    continue;

                // The path that accepts drawing instructions
                GraphicsPath path = new GraphicsPath();

                // Create the IGlyphOutlinePainter implementation
                GlyphOutlinePainter outlinePainter = new GlyphOutlinePainter(path);

                // Create the renderer
                Aspose.Font.Renderers.IGlyphRenderer renderer = new Aspose.Font.Renderers.GlyphOutlineRenderer(outlinePainter);

                // Get common glyph properties
                double kerning = 0;

                // Get the kerning value

                if (previousGid != null)
                {
                    kerning = (font.Metrics.GetKerningValue(previousGid, gid) / glyph.SourceResolution) * fontSize * resolutionCorrection;
                    kerning += FontWidthToImageWith(font.Metrics.GetGlyphWidth(previousGid), glyph.SourceResolution, fontSize);
                }

                // Glyph positioning - increase the glyph X coordinate according to the kerning distance
                glyphXCoordinate += kerning * kerningCoefficient;

                // Glyph placement matrix
                TransformationMatrix glyphMatrix = new TransformationMatrix(
                        new double[]
                                { fontSize * resolutionCorrection,
                            0,
                            0,
                        // negative because of the bitmap coordinate system begins from the top
                            - fontSize*resolutionCorrection,
                            glyphXCoordinate,
                            glyphYCoordinate
                                });

                // Render the current glyph
                renderer.RenderGlyph(font, gid, glyphMatrix);

                // Fill the path
                path.FillMode = FillMode.Winding;

                outGraphics.FillPath(textBrush, path);
            }

            //Set the current gid as previous to get the correct kerning for the next glyph
            previousGid = gid;
        }

        //Save the results
        outBitmap.Save(outFile);
    }



FAQ

1. 我可以使用哪种图像在其上书写文本?

API 最适合清晰的高分辨率图像。避免使用模糊的照片或背景复杂的图像,因为这些会影响文本放置的准确性。

2. 我可以自定义文本字体和样式吗?

是的,Aspose.Font 允许您为文本叠加指定字体样式、大小甚至颜色。它提供文本的自定义输出,例如,当您想要压缩、拉伸、以一定角度旋转文本或其他操作时。

3. API 如何处理文本放置?

它提供了预定义的位置,例如居中或底部对齐,但它还提供了一种更高级(自定义)的方法,即使用 GlyphOutlineRenderer 类RenderGlyph() 方法之一将文本转换为图像。