kehuadong

stb_image实现gif转jpg

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <fstream>
#include <memory>
using namespace std;

void* file_read_data(const char* path, int* size) {
	// 打开文件
	ifstream fin(path, ios::binary);
	if (!fin) {
		return nullptr;
	}

	// 获取长度
	fin.seekg(0, ios::end);
	*size = fin.tellg();
	if (!*size) {
		return nullptr;
	}

	// 获取内容并返回
	fin.seekg(0, ios::beg);
	void* buff = malloc(*size);
	fin.read((char*)buff, *size);
	return buff;
}

int main(int argc, char* argv[]) {
	if (argc < 3) {
		return -1;
	}

	int size;
	void* buff = file_read_data(argv[1], &size);
	if (!buff) {
		return -2;
	}

	int w, h;
	int frame_cnt;
	unique_ptr<stbi_uc[]> data(stbi_load_gif_from_memory((const stbi_uc*)buff, size, NULL, &w, &h, &frame_cnt, NULL, 3));
	free(buff);
	if (!data) {
		return -3;
	}

	printf("w = %d, h = %d, frame_cnt = %d\n", w, h, frame_cnt);
	if (!w || !h || !frame_cnt) {
		return -4;
	}

	char path[1024];
	sprintf(path, "mkdir -p %s\n", argv[2]);
	system(path);

	size = w*h*3;
	for (int i = 0; i < frame_cnt; i++) {
		void* p = &data[size*i];
		snprintf(path, 1024, "%s/%03d.jpg", argv[2], (i+1));
		stbi_write_jpg(path, w, h, 3, p, 70);
	}

	return 0;
}

 

posted on   kehuadong  阅读(95)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示