On Fri, 30 Mar 2001, Tony Robbins wrote:
> I ended up going with the TIFF image format (uncompressed), but I'm
> running into some major problems.
TIFF is a complex graphics file format. I would recommend against this
choice, not only because writing a proper reader for the format will be
difficult and time-consuming, but also because its overkill for what you
need.
PPM is incredibly simple, especially with raw bits mode. A simple reader:
struct PpmImage {
ulong width;
ulong height;
char *bitmap;
};
struct PpmImage *load_ppm_bitmap(const char *fname)
{
struct PpmImage *ppm;
ush_int magic;
int bmpsize;
int cols;
int rows;
FILE *fp;
char c;
int mv;
if (!(fp = fopen(fname, "r"))) {
perror(fname);
return (NULL);
} else if (fscanf("%hu %d %d %d\n", &magic, &cols, &rows, &mv) != 4) {
log("SYSERR: %s: corrupt header", fname);
fclose(fp);
return (NULL);
} else if (magic != 0x3650) { /* "P6" */
log("SYSERR: %s: not a rawbits ppm file", fname);
fclose(fp);
return (NULL);
} else if (mv > 255) {
/* The file is corrupt -- it's not in the format it says it is. */
log("SYSERR: %s: header is P6 but max color value implies P3",
fname);
fclose(fp);
return (NULL);
}
bpmsize = cols * rows;
CREATE(ppm, sizeof(struct PpmImage), 1);
CREATE(ppm->bitmap, char, bmpsize);
ppm->width = cols;
ppm->height = rows;
/* ppm(5) says no whitespace in pixel area, so this should suffice */
if ((mv = fread(ppm->bitmap, sizeof(char), bmpsize, fp)) != bmpsize)
log("WARNING: %s: expected %d bytes, got %d", bmpsize, mv);
return (ppm);
}
This doesn't support comments, isn't very robust, blah, blah. But I think
it should work. YMMV -- it's Mailer Code(tm). More information on PPM
can be found by typing 'man ppm' on most UNIX machines -- this
documentation is what I used to write the above.
Most programs should be capable of outputting raw bits PPM. Writing a
reader for the color triplet version of PPM (magic number would be "P3",
or 0x3350 encoded as a short) is not much more difficult (i.e., it's
nothing that couldn't be accomplished by just adding a loop that does
fscanf for the RGB pixel values), but is left as an exercise to the reader
if he really wants/needs it.
-dak
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST