马上注册,结交更多易友,享用更多功能,让你轻松玩转觅风论坛。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
WEBP的压缩比例公认的牛,我这边现在远程协议用的就是这个压缩传输推送到WEB
調用方法簡單,直接传递图片字节集进去,然后返回压缩后的字节集。相比网上调用的DLL都是压缩到本地 这个好用多了,模块我写了两种方法 一个是直接DLL调用 一个是内存加载,内存加载的调用了凌哥的内存加载提取版 可以自行替换其他的
这是DLL的C++代码。 看得懂的自己改 看不懂的直接忽略
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include "webp/encode.h"
// input_image 传入的图片数据
// input_size 传入的图片大小
// processed_data 返回处理过的数据 易语言里面调用需要传址
// processed_size 返回处理过图片大小
// Image_quality 图片质量
bool __stdcall SaveImageAsWebp(const char* input_image, size_t input_size, char** processed_data, size_t* processed_size, int Image_quality) {
int width, height, channels;
// 使用stb_image从字节数组中加载图像
unsigned char* img_data = stbi_load_from_memory(reinterpret_cast<const uint8_t*>(input_image), static_cast<int>(input_size), &width, &height, &channels, 4);
if (img_data == nullptr) {
// std::cerr << "内存加载图像出错." << std::endl;
return false;
}
// 编码图像为WEBP格式
unsigned char* webp_data = nullptr;
*processed_size = WebPEncodeRGBA(img_data, width, height, width * 4, Image_quality, &webp_data);
if (*processed_size == 0) {
// std::cerr << "将图像编码为WEBP格式时出错." << std::endl;
stbi_image_free(img_data);
return false;
}
// 将编码后的数据分配给processed_data
*processed_data = reinterpret_cast<char*>(webp_data);
// 释放img_data资源
stbi_image_free(img_data);
return true;
}
// 调用方在使用完processed_data后需要调用这个函数来释放资源
void __stdcall FreeWebpData(unsigned char** data) {
if (data && *data) {
free(*data);
*data = nullptr; // 将指针设为nullptr,以防止重复释放
}
}
|
|