c++ - 将 BGR 图像转换为 jpeg 格式的 base64 字符串
问题描述
我有以 OpenCV 约定表示的彩色图像,其中每个像素都unsigned char
以 BGR 顺序逐行表示:
const int BGR = 3;
const int rows= 256;
const int cols = 512;
unsigned char rawIm[BGR * rows *cols] = {'g', 't', 'y', // lots of chars.....}
我想将此流转换为代表相应 jpeg 图像的 base64 字符串,而无需实际将图像写入磁盘,只是“普通”字节转换。我怎么能在 C++ 中做到这一点?
解决方案
对于图像转jpeg部分,您可以使用toojpeg,它比libjpeg更容易使用。 https://create.stephan-brumme.com/toojpeg/
但是您必须先将 BGR 反转为 RGB,因为 toojpeg 还不支持 BGR。
这是一个例子:
#include <vector>
#include <string>
#include <iostream>
#include "toojpeg.h"
std::vector<unsigned char> jpeg_data;
void myOutput(unsigned char byte) {
jpeg_data.push_back(byte);
}
int main() {
const auto width = 800;
const auto height = 600;
const auto bytesPerPixel = 3;
unsigned char bgr_data[width * height * bytesPerPixel];
// put some sample data in bgr_data, just for the example
for (unsigned i = 0; i < sizeof(bgr_data); i += 3) {
bgr_data[i] = i / width;
bgr_data[i + 1] = i / width * 2;
bgr_data[i + 2] = i / width * 3;
}
// convert BGR to RGB
unsigned char rgb_data[sizeof(bgr_data)];
for (unsigned i = 0; i < sizeof(bgr_data); i += 3) {
rgb_data[i] = bgr_data[i + 2];
rgb_data[i + 1] = bgr_data[i + 1];
rgb_data[i + 2] = bgr_data[i];
}
// convert the RGB data to jpeg
bool isRGB = true;
const auto quality = 90;
const bool downsample = false;
const char* comment = "example image";
bool result_ok = TooJpeg::writeJpeg(myOutput, rgb_data, width, height, isRGB, quality, downsample, comment);
if (result_ok) {
// jpeg_data now contains jpeg-encoded image, which can be encoded as base 64
}
return 0;
}
推荐阅读
- forms - Rxwebvalidators 条件验证器在 formArray 的情况下不起作用
- java - 在 FOR 循环中使用 ParseObject
- python - Pandas 时间序列图:辅助 y 轴标签,设置下限
- c# - 如何在 C# 中检查代码是否在 AOT 中运行?
- azure - 如何使用 TOTP 通过 Azure AD MFA 对 VPN 进行身份验证?
- c - Arduino 和 SX1278 的 LoRa B 类实现 TDMA
- javascript - 添加节点后重复的对象
- mysql - 错误 1062:故障转移后从站上的重复条目
- c# - double.Parse(123.342) System.FormatException: '输入字符串的格式不正确。'
- android - 将视频添加到图库