如何打开.fli文件

How to open fli files

我是 C++ 的新手,负责处理一个 fli 文件,但不知道如何正确打开它们。 到目前为止,我的代码如下所示:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
    fstream newfile;
    newfile.open("testvid.fli", ios::in);object
    if (newfile.is_open()) {
        string tp;
        while (getline(newfile, tp)) {
            cout << tp << "\n";
        }
        newfile.close();
    }
    std::cin.ignore();
}

但它让我胡言乱语。有人可以帮忙吗?

我以前没有使用过 .fli 文件。是 FLIC file (used to store animations)? Then it makes sense that trying to reading them as strings produces gibberish. You could try either the Aseprite FLIC Library or LibFLIC.

编辑:我使用 Asperite 的库和 gif-h 将 FLIC 文件转换为 GIF。抱歉,代码效率低下 - 这只是使其工作的快速代码。

#include <iostream>
#include <iomanip>

#include <cstdio>
#include <vector>
#include <string>

#include <gif.h>
#include <flic.h>


int main() {
    std::string fname_input { "../data/2noppaa.fli" };
    std::string fname_output { "../data/2noppaa.gif" };

    // Set up FLIC file
    FILE *f = std::fopen(fname_input.c_str(), "rb");
    flic::StdioFileInterface file(f);
    flic::Decoder decoder(&file);
    flic::Header header;

    if (!decoder.readHeader(header)) {
        std::cout << "Error: could not read header of FLIC file." << std::endl;
        return 2;
    }

    const size_t frame_size = header.width * header.height;

    // Set up FLIC reader
    std::vector<uint8_t> buffer(frame_size);
    flic::Frame frame;
    frame.pixels = &buffer[0];
    frame.rowstride = header.width;

    // Set up GIF writer
    GifWriter g;
    GifBegin(&g, fname_output.c_str(), header.width, header.height, 0);

    std::vector<uint8_t> gif_frame(frame_size * 4, 255);
    flic::Color flic_color;

    for (int i = 0; i < header.frames; ++i) {
        if (!decoder.readFrame(frame)) {
            break;
        }

        // Convert FLIC frame to GIF
        for (size_t j = 0; j < frame_size; ++j) {
            flic_color = frame.colormap[ frame.pixels[j] ];

            gif_frame.at(j*4) = flic_color.r;
            gif_frame.at(j*4 + 1) = flic_color.g;
            gif_frame.at(j*4 + 2) = flic_color.b;
        }
        
        GifWriteFrame(&g, gif_frame.data(), header.width, header.height, 0);
    }

    GifEnd(&g);
}