【C++开源库使用】调用开源库STB中的stbi_load_from_memory加载图片文件,进行灰化处理,然后调用stbi_write_png或stbi_write_jpg将灰化图片保存到文件中

目录

1、图片灰化的实现思路

2、开源STB库下载

3、将图片文件的内容读到buffer中

4、将buffer中存放的图片文件数据传入到stbi_load_from_memory接口中,然后对返回的图片颜色值进行灰化处理

5、调用stbi_write_png或stbi_write_jpg接口将灰化后的图片数据保存成图片文件

6、图片灰化的完整代码


       前一篇文章我们讲到了使用libcurl库发http/https请求去下载用户头像文件(文章链接:https://blog.youkuaiyun.com/chenlycly/article/details/149175549,本篇文章则是同个SDK项目的后续需求中涉及到的功能。第三方厂商要求,对于不在线的人员,要显示灰化的头像。经研究决定使用开源STB库辅助实现图片灰化,调用STB开源库中的stbi_load_from_memorystbi_write_pngstbi_write_jpg等接口。本文详细讲述一下实现过程,以供大家借鉴或参考。

`stbi_load_gif_from_memory`加载多帧 GIF 时崩溃,可能有以下几种原因及对应的解决办法: ### 内存问题 - **内存分配失败**:若在使用`stbi_load_gif_from_memory`前,存储 GIF 数据的内存未正确分配,者内存空间不足,就会引发崩溃。要确保 GIF 数据的内存分配正确且足够。 ```c #include <stdio.h> #include <stdlib.h> #include "stb_image.h" int main() { FILE *f = fopen("test.gif", "rb"); if (!f) { printf("Unable to open file\n"); return 1; } fseek(f, 0, SEEK_END); int bufSize = ftell(f); fseek(f, 0, SEEK_SET); unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char) * bufSize); if (!buf) { printf("Out of memory\n"); fclose(f); return 1; } fread(buf, 1, bufSize, f); fclose(f); int *delays = NULL, width = 0, height = 0, frames = 1, nrChannels = 0; unsigned char *data = stbi_load_gif_from_memory(buf, bufSize, &delays, &width, &height, &frames, &nrChannels, 0); if (!data) { printf("Failed to load GIF: %s\n", stbi_failure_reason()); } else { // 处理加载的 GIF 数据 stbi_image_free(data); } free(buf); if (delays) { free(delays); } return 0; } ``` - **内存越界**:若传入`stbi_load_gif_from_memory`的内存大小参数有误,可能会导致内存越界访问,从而引发崩溃。要保证传入的内存大小参数准确无误。 ### GIF 数据损坏 - **文件损坏**:如果 GIF 文件本身损坏,`stbi_load_gif_from_memory`在解析时可能会崩溃。可以使用图像查看器其他工具检查 GIF 文件是否能正常打开,者尝试使用其他 GIF 文件进行测试。 - **数据截断**:在将 GIF 数据读入内存时,若发生数据截断,也会导致加载崩溃。要确保数据完整读入内存。 ### 函数参数问题 - **参数错误**:`stbi_load_gif_from_memory`的参数如`delays`、`width`、`height`等若未正确初始化,可能会使函数内部处理出错。要确保所有参数都正确初始化。 ```c int *delays = NULL; int width = 0, height = 0, frames = 0, nrChannels = 0; // 调用 stbi_load_gif_from_memory unsigned char *data = stbi_load_gif_from_memory(buf, bufSize, &delays, &width, &height, &frames, &nrChannels, 0); ``` ### 版本问题 - **版本不兼容**:使用的`stb_image`版本可能存在 bug 者与代码不兼容。可以尝试更新到最新版本的`stb_image`
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dvlinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值