如何在 C 中制作 ppm 文件的 black-and-white 图片?
How to do a black-and-white picture of a ppm file in C?
嘿,我的代码需要一点帮助,我读取了一个 ppm 文件,将颜色更改为黑色和白色,并想将其保存到一个新文件中。我可以读取文件的 header 并将其写入新文件,但我一直在努力更改颜色。我知道我可以通过以下公式获得灰度值:0.299 * 红色分量 + 0.587 * 绿色分量 + 0.114 * 蓝色分量。有谁知道我怎样才能把它写成代码?
int main(int argc, char **argv)
{
FILE *oldFile, *newFile;
int width, height, max_colour;
oldFile = fopen("oldpic.ppm","rb");
newFile = fopen("newpic.ppm","wb");
fscanf (oldFile, "P6\n %d %d %d", &width, &height, &max_colour);
unsigned char *data = malloc(width*height);
fread(data,1,width*height,oldFile);
fprintf(newFile, "P6\n%d %d\n%d\n", width, height, max_colour);
for (int j = 0; j < width; ++j)
{
for (int i = 0; i < height; ++i)
{
unsigned char color[3];
color[0] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* red */
color[1] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* green */
color[2] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* blue */
(void) fwrite(color, 1, 3, newFile);
}
}
(void) fclose(newFile);
return 0;
}
您可能需要缩放二进制算术。
此外,即使您可以将输入数据读取到一个大数组中,一次读取和处理它可能更容易。
这是为做到这一点而重新编写的代码:
int
main(int argc, char **argv)
{
FILE *oldFile;
FILE *newFile;
int width;
int height;
int max_colour;
oldFile = fopen("oldpic.ppm", "rb");
newFile = fopen("newpic.ppm", "wb");
fscanf(oldFile, "P6\n %d %d %d", &width, &height, &max_colour);
#if 0
unsigned char *data = malloc(width * height);
fread(data, 1, width * height, oldFile);
#endif
fprintf(newFile, "P6\n%d %d\n%d\n", width, height, max_colour);
for (int j = 0; j < width; ++j) {
for (int i = 0; i < height; ++i) {
unsigned char color[3];
unsigned int grey;
fread(color, 1, 3, oldFile);
grey = 0;
grey += 299u * color[0]; // red
grey += 586u * color[1]; // green
grey += 114u * color[2]; // blue
grey /= 1000;
color[0] = grey;
color[1] = grey;
color[2] = grey;
fwrite(color, 1, 3, newFile);
}
}
fclose(oldFile);
fclose(newFile);
return 0;
}
嘿,我的代码需要一点帮助,我读取了一个 ppm 文件,将颜色更改为黑色和白色,并想将其保存到一个新文件中。我可以读取文件的 header 并将其写入新文件,但我一直在努力更改颜色。我知道我可以通过以下公式获得灰度值:0.299 * 红色分量 + 0.587 * 绿色分量 + 0.114 * 蓝色分量。有谁知道我怎样才能把它写成代码?
int main(int argc, char **argv)
{
FILE *oldFile, *newFile;
int width, height, max_colour;
oldFile = fopen("oldpic.ppm","rb");
newFile = fopen("newpic.ppm","wb");
fscanf (oldFile, "P6\n %d %d %d", &width, &height, &max_colour);
unsigned char *data = malloc(width*height);
fread(data,1,width*height,oldFile);
fprintf(newFile, "P6\n%d %d\n%d\n", width, height, max_colour);
for (int j = 0; j < width; ++j)
{
for (int i = 0; i < height; ++i)
{
unsigned char color[3];
color[0] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* red */
color[1] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* green */
color[2] = 0.299 * ? + 0.587 * ? + 0.114 * ?; /* blue */
(void) fwrite(color, 1, 3, newFile);
}
}
(void) fclose(newFile);
return 0;
}
您可能需要缩放二进制算术。
此外,即使您可以将输入数据读取到一个大数组中,一次读取和处理它可能更容易。
这是为做到这一点而重新编写的代码:
int
main(int argc, char **argv)
{
FILE *oldFile;
FILE *newFile;
int width;
int height;
int max_colour;
oldFile = fopen("oldpic.ppm", "rb");
newFile = fopen("newpic.ppm", "wb");
fscanf(oldFile, "P6\n %d %d %d", &width, &height, &max_colour);
#if 0
unsigned char *data = malloc(width * height);
fread(data, 1, width * height, oldFile);
#endif
fprintf(newFile, "P6\n%d %d\n%d\n", width, height, max_colour);
for (int j = 0; j < width; ++j) {
for (int i = 0; i < height; ++i) {
unsigned char color[3];
unsigned int grey;
fread(color, 1, 3, oldFile);
grey = 0;
grey += 299u * color[0]; // red
grey += 586u * color[1]; // green
grey += 114u * color[2]; // blue
grey /= 1000;
color[0] = grey;
color[1] = grey;
color[2] = grey;
fwrite(color, 1, 3, newFile);
}
}
fclose(oldFile);
fclose(newFile);
return 0;
}