2013-11-20 127 views
0

我的程序存在问题。我一直试图谷歌的问题,但似乎无法找到我可以使用的东西。我对C很陌生,所以想尽一切办法学习。将图像转换为黑色和白色的问题C

当我尝试用./imgconvert.c我碰到下面的错误运行:

./imgconvert.c: line 6: struct: command not found 
./imgconvert.c: line 7: uint8_t: command not found 
./imgconvert.c: line 8: syntax error near unexpected token `}' 
./imgconvert.c: line 8: `};' 

我试图编译程序的财产以后像myProgram.o有: gcc -c imgconvert.c -o myProgram.o然后./myProgram。但我得到一个权限错误,如果我修复使用chmod然后我得到这个错误:

bash: ./myProgram.o: cannot execute binary file 

我不知道该怎么办?

代码:

#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.ppm", &sizex, &sizey); 

    outputimg = malloc(sizex * sizey * 4); 

    convert_grayscale(inputimg, outputimg, sizex, sizey); 

    save_image("output.ppm", outputimg, sizex, sizey); 
} 
+0

灰度!=黑色和白色。如果你想B&W你想要一个二值化过滤器,它有一个中间值,所有> n变成1,所有变量都变为0。 – Matt

+1

将来,请将您的代码内嵌在问题中;请勿链接到外部网站。我们希望这个问题从现在起仍然有意义,“pastebin”类型网站经常会在一段时间后删除。 – zwol

回答

1

传递-c仅与gcc编译源文件成目标文件。在构建可执行文件时,应该省略它(以及“.o”后缀)。

1

您已将程序编译为可执行文件。假设它仅包含一个文件(imgconvert.c)的:

cc -o imgconvert imgconvert.c 

然后你就可以运行它:

./imgconvert 
2

立即问题是,C程序必须编译和链接。你的GCC调用使用-c选项,它告诉它只执行“编译”部分。尝试代替

gcc -g -Wall imgconvert.c -o imgconvert 

然后

./imgconvert 

我增加了一些新的选项,-g这意味着产生的调试信息,-Wall这意味着使所有的警告,真的应该在默认情况下开启,但不。我没有仔细看过你的代码,但它很有可能是,你会从第一条命令中得到一些“警告:”消息,你应该修复它。

使用-c选项,您将得到的是一个“对象”文件(这就是“.o”所代表的内容),它仅用作后续链接操作的输入。当你开始编写大于明智地适合一个文件的程序时,你会希望这一点。

顺便说一下,当你试图直接执行C源代码时,你得到的错误是因为为了保持向后兼容性而保留的古代默认值,shell试图执行任何不可识别的编译可执行文件(\177ELF位于文件的开头)或正确标记的解释脚本(位于文件开头的#! /path/to/interpreter),就好像它是一个shell脚本。

+0

这工作。按计划,我得到了一张黑白图像。谢谢您的帮助。 – user3013923

相关问题