Я написал небольшую тестовую программу, которая делает скриншот экрана. Я использую некоторую функцию для сжатия изображения. Затем я использую библиотеку Poco, чтобы закодировать его в строку base64. Чтобы проверить правильность кодировки, я сохраняю закодированную строку в файл так же, как сохраняю в файл сам скриншот. Чтобы убедиться, что я получаю правильный снимок экрана и правильно конвертирую его в строку base64.
Но я получаю неправильную строку base64. У него какой-то странный формат. И я не могу конвертировать его обратно в изображение ни в одном онлайн-декодере. Пожалуйста, помогите мне понять, как исправить мой код, чтобы получить правильную строку base64.
У меня есть еще один вопрос. Можно ли как-то получить изображение в формате JPEG, не используя немаленькую библиотеку libJPEG? Я нашел один простой пример — Toojpeg
Но я не могу с его помощью сохранить изображение. Как правильно использовать эту библиотеку?
Я использую Kubuntu 20.04, Clion IDE, conan 1.62.
Необходимо настроить проект в CLion IDE (опции cmake) :
Код: Выделить всё
-G Ninja -DAGENT_VERSION=1.5.0 -DCMAKE_TOOLCHAIN_FILE=external/cmake-helpers/toolchains/x86_64-linux-clang.cmake -DENABLE_DEBUG_MODE:BOOL=ON
Код: Выделить всё
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define FMT_HEADER_ONLY
#include
#include
#include
#include
#include "DateTime.hpp"
int width;
int height;
std::vector image_buffer;
// function compress image data
std::vector process_scale_bilinear(XImage * image, int new_width, int new_height){
std::vector image_data;
std::vector image_data_row;
float x_ratio = ((float) (width))/new_width;
float y_ratio = ((float) (height))/new_height;
unsigned long red_mask = image->red_mask;
unsigned long green_mask = image->green_mask;
unsigned long blue_mask = image->blue_mask;
for (int new_y=0; new_y < new_height; new_y++) {
for (int new_x=0; new_x < new_width; new_x++) {
// x1, y1 is coordinates original pixel to take from original image
// x2 is step to the right
//y2 is step down
int x_1 = new_x * x_ratio;
if (x_1 >= width) x_1 = width - 1; //becouse start pint is 0 and final is 1 less
int y_1 = new_y * y_ratio;
if(y_1 >= height) y_1 = height - 1; //becouse start pint is 0 and final is 1 less
int x_2 = x_1 + x_ratio;
if (x_2 >= width) x_2 = width - 1;
int y_2 = y_1 + y_ratio;
if(y_2 >= height) y_2 = height - 1;
float x_diff = (x_ratio * new_x) - x_1 ;
float y_diff = (y_ratio * new_y) - y_1 ;
// 4 point for bilineral function
unsigned long q_1_1 = XGetPixel(image, x_1, y_1);
unsigned long q_1_2 = XGetPixel(image, x_1, y_2);
unsigned long q_2_1 = XGetPixel(image, x_2, y_1);
unsigned long q_2_2 = XGetPixel(image, x_2, y_2);
// blue element
// Yb = Ab(1-w1)(1-h1) + Bb(w1)(1-h1) + Cb(h1)(1-w1) + Db(wh)
float blue = (q_1_1 & blue_mask) * (1 - x_diff) * (1 - y_diff) + (q_1_2 & blue_mask) * (x_diff) * (1 - y_diff) +
(q_2_1 & blue_mask) * (y_diff) * (1 - x_diff) + (q_2_2 & blue_mask) * (x_diff * y_diff);
// green element
// Yg = Ag(1-w1)(1-h1) + Bg(w1)(1-h1) + Cg(h1)(1-w1) + Dg(wh)
float green = ((q_1_1 & green_mask) >> 8) * (1-x_diff) * (1-y_diff) + ((q_1_2 & green_mask) >> 8) * (x_diff) * (1 - y_diff) +
((q_2_1 & green_mask) >> 8) * (y_diff) * (1-x_diff) + ((q_2_2 & green_mask) >> 8) * (x_diff * y_diff);
// red element
// Yr = Ar(1-w1)(1-h1) + Br(w1)(1-h1) + Cr(h1)(1-w1) + Dr(wh)
float red = ((q_1_1 & red_mask) >> 16) * (1 - x_diff) * (1 - y_diff) + ((q_1_2 & red_mask) >> 16) * (x_diff) * (1 - y_diff) +
((q_2_1 & red_mask) >> 16) * (y_diff) * (1 - x_diff) + ((q_2_2 & red_mask) >> 16) * (x_diff * y_diff);
image_data_row.push_back((int) red);
image_data_row.push_back((int) green);
image_data_row.push_back((int )blue);
}
image_data.push_back(image_data_row);
image_data_row.clear();
}
// update width and height after resize
width = new_width;
height = new_height;
return image_data;
};
bool save_to_jpeg(const char * path, int quality)
{
FILE *fp = NULL;
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPARRAY row;
fp = fopen(path, "wb");
if (!fp) {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78320299/c-write-screenshot-to-memory-and-encoding-to-base64[/url]