我一直在努力使這個節目的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