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;
}

// 写入 PPM 头部
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

运行结果如图:
red.jpg

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