示例#1
0
static int
read_header (FILE *fp, const char *magic, int *width, int *height, 
        int *maxval)
{
    char m[3] = { 0 };
    int ignored = fread (m, sizeof(m)-1, 1, fp);
    if (strcmp(m, magic)) {
        fprintf(stderr, "bad magic [%s]\n", m); return -1;
    }
    if (0 != skip_whitespace_and_comments(fp)) return -1;
    if (1 != fscanf(fp, "%d", width)) return -1;
    if (0 != skip_whitespace_and_comments(fp)) return -1;
    if (1 != fscanf(fp, "%d", height)) return -1;
    if (0 != skip_whitespace_and_comments(fp)) return -1;
    if (1 != fscanf(fp, "%d", maxval)) return -1;
    if (EOF == fgetc(fp)) return -1;
    return 0;
}
示例#2
0
int load_pnm_from_FILE(FILE *f, unsigned char ***pixels, int *width, int *height)
{
    int maxval;
    char type;

    if (getc(f) != 'P')
    {
        fprintf(stderr, "PNM file not starts with 'P'\n");
        exit(1);
    }
    
    type = getc(f);
    skip_whitespace_and_comments(f);
    
    switch(type)
    {
        case '4':
            fscanf(f, "%d %d", width, height);
            maxval = 255;
        break;
        case '5': case '6':
            fscanf(f, "%d %d %d", width, height, &maxval);
        break;
        default:
            fprintf(stderr, "only raw PNM files supported\n");
            exit(1);
            
    }

    if (maxval != 255)
    {
        fprintf(stderr, "only 256-levels PNM supported\n");
        exit(1);
    }

    switch(fgetc(f))
    {
        case ' ': case '\t': case '\r': case '\n':
            break;
        default:
            fprintf(stderr, "corrupted PNM, current offset is %ld\n", ftell(f));
            exit(1);
    }

    switch(type)
    {
        case '4':
            *pixels = allocate_bitmap(*width, *height);
            load_pbm_raster(f, *pixels, *width, *height);
            return PBM;
        case '5':
            *pixels = allocate_bitmap(*width, *height);
            fread(**pixels, *width, *height, f);
            return PGM;
        case '6':            
            *pixels = allocate_bitmap(*width * 3, *height);
            fread(**pixels, *width * 3, *height, f);
            return PPM;
        default:
            assert(0);
            return 0;
    }
}