将新的视觉元素编码到图像文件中,首先要对图像文件的正常显示方式有基本的了解。当加载图像文件以在我们的任何设备上显示时,该设备的软件必须首先解码文件并将解码结果存储在称为缓冲区的临时内存块中。缓冲区负责传达图像中每个像素存储的颜色信息(在每种情况下,文件都会打开),从那里,颜色信息可以通过我们设备的照明(通常是 LCD 或 LED)显示屏呈现。
当我们想要对显示在图像顶部的新文本或形状进行分层时,我们需要访问内存中的文件并创建我们自己的临时图像缓冲区以在其中工作。这个新的缓冲区将使我们能够控制图像中全新的像素层,使我们能够暂时影响并最终保存图像的最终显示更改。我们的图像随后如何实现我们的新缓冲区取决于原始文件格式。例如,如果我们从一个PNG文件开始,我们将利用内置的透明度功能将新内容叠加到原始文件之上。如果我们从一个不提供透明度功能的 JPG 文件开始,我们最终会得到一个单一的混合图像层,它有效地将新内容和原始内容混合在一起。在任何一种情况下,操作的结果都将保留原始文件的编码,从而使我们能够轻松地将生成的(稍大一些)文件编码完全写入新文件。
创建新的缓冲区需要我们编写代码来访问内存中图像文件的编码。我们可以更有效地(即,使用最少的代码)将图像文件上传到专门的图像处理库,而不是从头开始编写一堆新代码(这个过程需要我们并不总是有时间)。这样做使我们能够通过构建对库的特定组件的请求来影响新像素矩阵(例如颜色、字体或许多其他样式元素)的显示。
在通过我们的图像处理库创建的临时缓冲区中,我们可以发出请求,引用新像素矩阵上的特定点(它与原始图像的确切像素高度和宽度尺寸匹配),就像我们在任何规则 X/Y 轴上绘制点一样。我们可以使用坐标轻松决定我们的新内容应该在原始图像顶部显示的位置,并确定它应该是什么大小。例如,如果我们从 1000 x 1000 像素的图像开始,则在缓冲区中以 250 x 250 像素放置的新内容将显示在图像的左下角。如果我们创建的内容是一个简单的矩形框,我们也可以很容易地确定框的四条线的相对粗细(以像素为单位)。
示范
在本文的其余部分,我将演示两个 API,它们可用于以编程方式编写文本和在内存中的图像文件上绘制矩形。为了帮助您构建每个 API 调用,我提供了随时可以运行的 Java 代码示例,您可以轻松地从中复制和粘贴这些示例。这些解决方案利用上述图像缓冲过程,允许您通过简单、直观的请求参数与图像文件编码无缝通信。这些解决方案包括:
在图像上绘制文本
在图像上绘制矩形
在我们深入研究每个 API 并突出显示它们各自的请求参数之前,让我们先了解一下客户端 SDK 的安装步骤。
我们可以先在 Maven POM 文件中添加对仓库的引用(这使用 Jitpack 动态编译库):
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
之后,我们可以添加对依赖项的引用:
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
在图像上绘制文本
在图像顶部创建文本层涉及一些基本的移动部分。首先,我们需要指定我们想要包含的文本内容、我们希望文本使用的字体、文本的大小,最后是它的颜色。之后,我们需要确定文本应该出现在图像上的位置——这个位置可以用相对于原始图像的确切像素尺寸的 x/y 像素坐标来表示——以及包含文本的不可见“框”的高度和宽度。考虑到所有这些,我们可以像这样构建我们的 “将文本绘制到图像 ”请求:
{
"BaseImageBytes": "string",
"BaseImageUrl": "string",
"TextToDraw": [
{
"Text": "string",
"FontFamilyName": "string",
"FontSize": 0,
"Color": "string",
"X": 0,
"Y": 0,
"Width": 0,
"Height": 0
}
]
}
正如我们所看到的,首先是有关基本图像字节(或基本图像 URL,建议用于特别大的文件)的请求信息,然后是 TextToDraw 对象,该对象确定文本输出。
我们可以使用以下代码来发出请求:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
EditApi apiInstance = new EditApi();
DrawTextRequest request = new DrawTextRequest(); // DrawTextRequest | Draw text parameters
try {
byte[] result = apiInstance.editDrawText(request);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling EditApi#editDrawText");
e.printStackTrace();
}
在图像上绘制矩形
在构建我们的请求时,在图像顶部创建一个矩形涉及的定制略少。此 API 允许我们确定矩形边框的颜色和宽度,并且它还允许我们确定要用什么颜色(如果有)填充形状。除此之外,我们在图像中放置矩形的方式与放置文本框的方式相同,涉及 X/Y 像素坐标和特定的高度和宽度测量值。我们的请求可以像这样构建:
{
"BaseImageBytes": "string",
"BaseImageUrl": "string",
"RectanglesToDraw": [
{
"BorderColor": "string",
"BorderWidth": 0,
"FillColor": "string",
"X": 0,
"Y": 0,
"Width": 0,
"Height": 0
}
]
}
一旦我们按照自己的喜好配置了我们的请求,我们就可以期望在我们指定的位置的图像上看到一个完全定制的矩形形状。如果我们在文本操作之前执行此操作,我们也可以轻松地将文本分层到矩形的顶部。
我们可以使用以下代码来构建我们的 API 请求:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");
EditApi apiInstance = new EditApi();
DrawRectangleRequest request = new DrawRectangleRequest(); // DrawRectangleRequest | Draw rectangle parameters
try {
byte[] result = apiInstance.editDrawRectangle(request);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling EditApi#editDrawRectangle");
e.printStackTrace();
}
这两种操作都将返回编码字符串,我们可以轻松地将其写入新文件。