您可以在安裝libpng後以這種方式完成: uint8_t pixels = new uint8_t [w h * 3]; glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE,(GLvoid *)pixels);
for (int j = 0; j * 2 < h; ++j) {
int x = j * w * 3;
int y = (h - 1 - j) * w * 3;
for (int i = w * 3; i > 0; --i) {
uint8_t tmp = pixels[x];
pixels[x] = pixels[y];
pixels[y] = tmp;
++x;
++y;
}
}
png_structp PNG = png_create_write_struct(PNG_LIBPNG_VER_STRING,nullptr,nullptr,nullptr); if(!png) return false;
png_infop info = png_create_info_struct(png);
if (!info) {
png_destroy_write_struct(&png, &info);
return false;
}
std::string s = "IMAGE/"+string(filename);
FILE *fp = fopen(s.c_str(), "wb");
if (!fp) {
png_destroy_write_struct(&png, &info);
return false;
}
png_init_io(png, fp);
png_set_IHDR(png, info, w, h, 8 , PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
png_colorp palette = (png_colorp)png_malloc(png, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
if (!palette) {
fclose(fp);
png_destroy_write_struct(&png, &info);
return false;
}
png_set_PLTE(png, info, palette, PNG_MAX_PALETTE_LENGTH);
png_write_info(png, info);
png_set_packing(png);
png_bytepp rows = (png_bytepp)png_malloc(png, h * sizeof(png_bytep));
for (int i = 0; i < h; ++i)
rows[i] = (png_bytep)(pixels + (h - i - 1) * w * 3);
png_write_image(png, rows);
png_write_end(png, info);
png_free(png, palette);
png_destroy_write_struct(&png, &info);
fclose(fp);
delete[] rows;
我在編碼/解碼視頻文件方面並不是很有經驗,但我認爲你最好的選擇是尋找一個能爲你做到這一點的圖書館,而且你只需將數據傳遞給它。如果它的任何部分與我想象的音頻(哪個)相同,它不會變得微不足道。不幸的是,我不知道任何圖書館。 – Daniel 2014-09-27 17:22:51
問題是,你並沒有要求特定的幫助。有很多庫能夠將一系列RGB圖像編碼成視頻流(ffmpeg,gstreamer,我非常確定OSX有本地的東西)。除非您要求提供有關這些庫的具體內容,否則此問題無意義。 – peppe 2014-09-28 20:18:07