我一直在努力使这个节目的TGA图像转换为颜色分为黑色和白色。但我不知道如何去做。我对C很感兴趣,并且还没有掌握ubuntu的语法和适当的用法。问题转换TGA文件,以黑色和白色
我想我的问题是财产以后与THA TGA文件头不能被读取。因为我在tga文件上试用这个程序时得到的结果是一张没有高度的无法打开的图片。 “高度= 0”。
是否有一个基于C阅读了一些很好的联系?
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct pixel {
uint8_t r, g, b, a;
};
static uint8_t *load_image(char *filename, int *sizex, int *sizey)
{
uint8_t *image;
char buf[512];
char *bufptr;
int ret;
FILE *fp = fopen(filename, "r");
bufptr = fgets(buf, 512, fp);
ret = fscanf(fp, "%d %d\n", sizex, sizey);
bufptr = fgets(buf, 512, fp);
image = malloc(*sizex * *sizey * 4);
int i;
uint8_t *ptr = image;
for (i=0; i<*sizex * *sizey; ++i) {
ret = fread(ptr, 1, 3, fp);
ptr += 4;
}
fclose(fp);
return image;
}
static int save_image(const char *filename, uint8_t *image, int sizex, int sizey)
{
FILE *fp = fopen(filename, "w");
fprintf(fp, "P6\n%d %d\n255\n", sizex, sizey);
int i;
uint8_t *ptr = image;
for (i=0; i<sizex * sizey; ++i) {
fwrite(ptr, 1, 3, fp);
ptr += 4;
}
fclose(fp);
return 1;
}
void convert_grayscale(uint8_t *input, uint8_t *output, int sizex, int sizey)
{
// Y = 0.299 * R + 0.587 * G + 0.114 * B
int i;
for (i = 0; i < sizex * sizey; ++i)
{
struct pixel *pin = (struct pixel*) &input[i*4];
struct pixel *pout = (struct pixel*) &output[i*4];
float luma = 0.299 * pin->r + 0.587 * pin->g + 0.114 * pin->b;
if (luma > 255)
luma = 255;
uint8_t intluma = (int) luma;
pout->r = intluma;
pout->g = intluma;
pout->b = intluma;
pout->a = 255;
}
}
int main()
{
uint8_t *inputimg, *outputimg;
int sizex, sizey;
inputimg = load_image("image.tga", &sizex, &sizey);
outputimg = malloc(sizex * sizey * 4);
convert_grayscale(inputimg, outputimg, sizex, sizey);
save_image("output.tga", outputimg, sizex, sizey);
}
您使用读取模式“w”,fgets和fscanf,表明您认为TGA规范适用于* text *文件,而实际上它们是* binary *格式。不是每个图像都以相同的方式存储 - 看起来您正在假设TGA == PPM。要么开始尝试使用纯文本图像格式(如PPM),要么查阅如何读取二进制数据(以及TGA规格)。 – usr2564301
我应该在阅读之前阅读莫言的东西。 – user3013923
这永远不会伤害。尝试一步到位的方法 - 您的问题描述似乎是您已经写出转换后的TGA文件,而问题明显源于您的输入。向你的load_image函数中加入大量'printf'来持续检查你是否得到了你期望的数字。 – usr2564301