add lossless webp encoding
Some checks failed
ContinuousDelivery / linux-ubuntu (push) Has been cancelled
ContinuousDelivery / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Has been cancelled
ContinuousDelivery / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Has been cancelled
ContinuousDelivery / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Has been cancelled
ContinuousDelivery / windows (push) Has been cancelled
ContinuousDelivery / windows-asan (push) Has been cancelled
ContinuousDelivery / dumpsyms (push) Has been cancelled
ContinuousDelivery / release (push) Has been cancelled
ContinuousIntegration / linux (push) Has been cancelled
ContinuousIntegration / android (map[ndk_abi:arm64-v8a vcpkg_toolkit:arm64-android-23]) (push) Has been cancelled
ContinuousIntegration / android (map[ndk_abi:armeabi-v7a vcpkg_toolkit:arm-neon-android-23]) (push) Has been cancelled
ContinuousIntegration / android (map[ndk_abi:x86_64 vcpkg_toolkit:x64-android-23]) (push) Has been cancelled
ContinuousIntegration / macos (push) Has been cancelled
ContinuousIntegration / windows (push) Has been cancelled

This commit is contained in:
Green Sky 2025-04-07 16:18:32 +02:00
parent 923dbed53d
commit 4ca3048988
No known key found for this signature in database
GPG Key ID: DBE05085D874AB4A
2 changed files with 29 additions and 12 deletions

View File

@ -473,17 +473,17 @@ void SendImagePopup::render(float time_delta) {
if (compress) {
ImGui::SameLine();
ImGui::Combo("##compression_type", &current_compressor, "webp\0jpeg\0png\0qoi\0");
ImGui::Combo("##compression_type", &current_compressor, "webp\0webp lossless\0jpeg\0png\0qoi\0");
ImGui::Indent();
// combo "webp""webp-lossless""png""jpg?"
// if lossy quality slider (1-100) default 80
if (current_compressor == 0 || current_compressor == 1) {
if (current_compressor == 0 || current_compressor == 2) {
const uint32_t qmin = 1;
const uint32_t qmax = 100;
recalc_size |= ImGui::SliderScalar("quality", ImGuiDataType_U32, &quality, &qmin, &qmax);
}
if (current_compressor == 2) {
if (current_compressor == 1 || current_compressor == 3) {
const uint32_t qmin = 0;
const uint32_t qmax = 9;
recalc_size |= ImGui::SliderScalar("compression_level", ImGuiDataType_U32, &compression_level, &qmin, &qmax);
@ -529,16 +529,21 @@ void SendImagePopup::render(float time_delta) {
_on_send(new_data, ".webp");
}
} else if (current_compressor == 1) {
new_data = ImageEncoderWebP{}.encodeToMemoryRGBA(tmp_img, {{"compression_level", compression_level}});
if (!new_data.empty()) {
_on_send(new_data, ".webp");
}
} else if (current_compressor == 2) {
new_data = ImageEncoderSTBJpeg{}.encodeToMemoryRGBA(tmp_img, {{"quality", quality}});;
if (!new_data.empty()) {
_on_send(new_data, ".jpg");
}
} else if (current_compressor == 2) {
} else if (current_compressor == 3) {
new_data = ImageEncoderSTBPNG{}.encodeToMemoryRGBA(tmp_img, {{"png_compression_level", compression_level}});;
if (!new_data.empty()) {
_on_send(new_data, ".png");
}
} else if (current_compressor == 3) {
} else if (current_compressor == 4) {
new_data = ImageEncoderQOI{}.encodeToMemoryRGBA(tmp_img, {});;
if (!new_data.empty()) {
_on_send(new_data, ".qoi");

View File

@ -92,6 +92,13 @@ std::vector<uint8_t> ImageEncoderWebP::encodeToMemoryRGBA(const ImageResult& inp
if (extra_options.count("quality")) {
quality = extra_options.at("quality");
}
bool lossless = false;
int compression_level = 6;
if (extra_options.count("compression_level")) {
// if compression_level is set, we assume lossless
lossless = true;
compression_level = extra_options.at("compression_level");
}
// start encoding
@ -113,15 +120,20 @@ std::vector<uint8_t> ImageEncoderWebP::encodeToMemoryRGBA(const ImageResult& inp
return {};
}
int prev_timestamp = 0;
for (const auto& frame : input_image.frames) {
WebPConfig config;
if (!WebPConfigPreset(&config, WebPPreset::WEBP_PRESET_DEFAULT, quality)) {
std::cerr << "IEWebP error: WebPConfigPreset()\n";
WebPConfig config;
if (!WebPConfigPreset(&config, WebPPreset::WEBP_PRESET_DEFAULT, quality)) {
std::cerr << "IEWebP error: WebPConfigPreset()\n";
return {};
}
if (lossless) {
if (!WebPConfigLosslessPreset(&config, compression_level)) {
std::cerr << "IEWebP error: WebPConfigLosslessPreset()\n";
return {};
}
//WebPConfigLosslessPreset(&config, 6); // 9 for max compression
}
int prev_timestamp = 0;
for (const auto& frame : input_image.frames) {
WebPPicture frame_webp;
if (!WebPPictureInit(&frame_webp)) {
std::cerr << "IEWebP error: WebPPictureInit()\n";
@ -135,7 +147,7 @@ std::vector<uint8_t> ImageEncoderWebP::encodeToMemoryRGBA(const ImageResult& inp
}
if (!WebPAnimEncoderAdd(enc.get(), &frame_webp, prev_timestamp, &config)) {
std::cerr << "IEWebP error: WebPAnimEncoderAdd()\n";
std::cerr << "IEWebP error: WebPAnimEncoderAdd(): " << frame_webp.error_code << "\n";
WebPPictureFree(&frame_webp);
return {};
}