SOVOS苦图片久矣。总是想要玩一下图像但是奈何jpg和png存储有压缩,c/c++读起来不是那么方便。我这个多少有些精神洁癖的家伙又不想用python,又懒得用c/c++库(欸其实有道理啊,回头看看怎么用c/c++操作jpg和png),一直没有机会倒腾图片。但是现在情况有所改观,因为SOVOS非常幸运地发现竟然有一种图像格式叫做ppm。
1. ppm格式
ppm第一行固定为p6
第二行固定为宽度 高度,非二进制
第三行为255,含义是这个颜色分量的最大值
接下来的内容就全都是像素数据了,每个像素三个字节数据,分别代表rgb三个分量,图片换行时候不需要换行符隔开。
2. 示例
以下给出一个输出纯红色图片的代码示例:
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 32 33 34
| #include <stdio.h> #include <stdlib.h>
int main(void) { const char *filename = "red.ppm"; const int width = 256; const int height = 256; const int maxval = 255;
FILE *fp = fopen(filename, "wb"); if (!fp) { perror("fopen"); return EXIT_FAILURE; }
fprintf(fp, "P6\n%d %d\n%d\n", width, height, maxval);
for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { unsigned char r = 255; unsigned char g = 0; unsigned char b = 0; fwrite(&r, 1, 1, fp); fwrite(&g, 1, 1, fp); fwrite(&b, 1, 1, fp); } }
fclose(fp); printf("已生成 %s (%dx%d)\n", filename, width, height); return 0; }
|
你可以使用ffpmeg把ppm图片方便地转换成png或者jpg格式:
1
| ffmpeg -i red.ppm red.jpg
|
运行结果如图:

有了这项技术,SOVOS将能够愉快地继续点后面的科技树了😋