Android系统下使用C++实现合成一张白底300DPI的图片的函数,并在图片指定位置添加中文
时间: 2024-03-08 15:48:19 浏览: 149
图像拼接的一个小软件用C++实现的
4星 · 用户满意度95%
实现这一功能需要使用OpenCV库和中文字体库,以下是代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core/utils/filesystem.hpp>
void createWhiteImage(int width, int height, int dpi, std::string filePath) {
// Create image with white background
cv::Mat img(height, width, CV_8UC3, cv::Scalar(255, 255, 255));
img.dpi = cv::Size(dpi, dpi);
// Save image
cv::imwrite(filePath, img);
}
void addTextToImage(std::string filePath, std::string text, int x, int y, int fontSize, std::string fontPath) {
// Load image
cv::Mat img = cv::imread(filePath);
// Set font
cv::Ptr<cv::freetype::FreeType2> ft2 = cv::freetype::createFreeType2();
cv::String font_filename = fontPath;
if (!cv::utils::fs::exists(font_filename)) {
throw std::invalid_argument("Font file not found");
}
ft2->loadFontData(font_filename, 0);
// Set text parameters
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wtext = converter.from_bytes(text);
int baseline = 0;
cv::Size textSize = cv::getTextSize(wtext, cv::freetype::FONT_HERSHEY_SIMPLEX, fontSize, 1, &baseline);
cv::Point textOrg(x, y + textSize.height);
// Add text to image
cv::Mat black(img.size(), CV_8UC1, cv::Scalar(0));
ft2->putText(black, wtext, textOrg, fontSize, cv::Scalar(255), -1, 8, true);
cv::Mat alpha;
cv::cvtColor(black, alpha, cv::COLOR_GRAY2BGR);
std::vector<cv::Mat> channels;
cv::split(alpha, channels);
channels.push_back(255 - channels[0]);
cv::merge(channels, alpha);
cv::Mat rgba;
std::vector<cv::Mat> mat_array{img, alpha};
cv::merge(mat_array, rgba);
// Save image
cv::imwrite(filePath, rgba);
}
```
以上代码中,createWhiteImage()函数用于生成一张白底300DPI的图片,addTextToImage()函数用于在指定位置添加中文。其中,addTextToImage()函数使用了OpenCV中的freetype模块来添加中文,需要先调用createFreeType2()函数创建一个FreeType2对象,然后调用loadFontData()函数载入中文字体文件,最后调用putText()函数将中文添加到图片上。
在调用addTextToImage()函数时,需要将中文转换成Unicode编码的wstring类型,可以使用std::wstring_convert和std::codecvt_utf8_utf16<wchar_t>来完成转换。在获取中文文字大小时,需要调用cv::getTextSize()函数,并指定字体、字号、字间距等参数。在添加中文时,先将文字绘制到一个黑色的Mat对象上,然后将黑色Mat对象转换成RGBA格式,并将其与原图片合并。
阅读全文