stb_image实现gif转jpg

发布时间 2023-05-06 18:04:32作者: kehuadong
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"

#include <fstream>
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;
	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) {
		stbi_image_free(data);
		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, 90);
	}

	stbi_image_free(data);

	return 0;
}