This is tiff2ppm.m in view mode; [Download] [Up]
// tiff2ppm.m: Translate a TIFF file to PPM format
// Usage: tiff2ppm tifffile > ppmfile
// Compile with:
// cc -O -g tiff2ppm.m -o tiff2ppm -lsys_s -lNeXT_s -arch m68k -arch i386
// Written by cahalan@clouds.gsfc.nasa.gov, October, 1994.
#include <stdio.h>
#import <dpsclient/event.h>
#import <appkit/appkit.h>
#define maxVal 255
#define HI 240 // upper 4 bits
#define LO 15 // lower 4 bits
struct Color {unsigned char *R; unsigned char *G; unsigned char *B;
unsigned char *A;};
struct Color *pColor;
BOOL isPlanar = FALSE, hasAlpha = FALSE;
int width, height, samples = 3, bitsPerSample = 8, numColors = 3;
unsigned char r, g, b, invert = maxVal;
int colorSpace = NX_RGBColorSpace;
void die(char *s) {fprintf(stderr,"%s\n",s);exit(1);}
void writePPM(void)
{
register int x, y, i;
fprintf(stdout, "P6\n");
fprintf(stdout, "%d %d\n", width, height);
fprintf(stdout, "%d\n", maxVal);
// ********************* grayscale with "min-is-white"
if (samples==1 && bitsPerSample == 8) {
if(colorSpace == NX_OneIsWhiteColorSpace) invert = 0;
for (y=0; y<height; y++) for (x=0; x<width; x++) {
r = *pColor->R++ ^ invert;
for (i=0; i<3; i++) putchar(r);
}
return;
}
// ********************* increment Color ptr for planar or non-planar
switch(bitsPerSample) {
case 1:
case 2: die("Can't do monochrome!\n");
break;
case 4:
if(isPlanar) {samples = samples >> 1;
for (y=0; y<height; y++) for (x=0; x<width/2; x++) {
r = *pColor->R; g = *pColor->G; b = *pColor->B;
putchar(r & HI);
putchar(g & HI);
putchar(b & HI);
putchar(r << 4);
putchar(g << 4);
putchar(b << 4);
pColor->R++; pColor->G++; pColor->B++;
} }
else if(hasAlpha) { samples = samples >> 1;
for (y=0; y<height; y++) for (x=0; x<width; x++) {
r = *pColor->R; g = *pColor->G;
putchar(r & HI);
putchar(r << 4);
putchar(g & HI);
pColor->R += samples;
pColor->G += samples;
} }
else for (y=0; y<height; y++) for (x=0; x<width/2; x++) {
r = *pColor->R; g = *pColor->G; b = *pColor->B;
putchar(r & HI );
putchar(r << 4);
putchar(g & HI);
putchar(g << 4);
putchar(b & HI);
putchar(b << 4);
pColor->R += samples;
pColor->G += samples;
pColor->B += samples;
}
break;
case 8:
for (y=0; y<height; y++) for (x=0; x<width; x++) {
fwrite(pColor->R, 1, 1, stdout);
fwrite(pColor->G, 1, 1, stdout);
fwrite(pColor->B, 1, 1, stdout);
if(isPlanar) {pColor->R++; pColor->G++; pColor->B++;}
else {
pColor->R += samples;
pColor->G += samples;
pColor->B += samples;
}
}
break;
default: die("Don't recognize this TIFF type!\n");
break;
}
}
void main(int argc, char *argv[])
{
id tiff;
unsigned char *planeData[5] = {NULL, NULL, NULL, NULL, NULL};
unsigned char *meshedData = NULL;
NXSize size;
/* ********************* check usage ****************
if(argc > 1) {
fprintf(stderr, "argc = %d\n", argc);
fprintf(stderr, "Translating %s to PPM\n", argv[1]);
}
else die("Usage: tiff2ppm tiffFile > ppmFile");
*/
// ********************* read TIFF, load into imageRep *****
tiff = [[NXBitmapImageRep alloc] initFromFile:argv[1]];
// ********************* get a pointer to the image data *****
[tiff getDataPlanes:planeData];
/* fprintf(stderr, "planeData[] = {%ld, %ld, %ld, %ld, %ld}\n",
planeData[0], planeData[1], planeData[2],
planeData[3], planeData[4]);
*/
// ********************* get image dimensions, etc
[tiff getSize:&size];
width = size.width;
height = size.height;
samples = [tiff samplesPerPixel];
bitsPerSample = [tiff bitsPerSample];
numColors = [tiff numColors];
hasAlpha = [tiff hasAlpha];
colorSpace = [tiff colorSpace];
fprintf(stderr, "width = %d\t height = %d\n", width, height);
fprintf(stderr, "samples = %d\t bitsPerSample = %d\n", samples, bitsPerSample);
fprintf(stderr, "numColors = %d\t hasAlpha = %d\t colorSpace = %d\n",
numColors, hasAlpha, colorSpace);
// ********************* init Color ptr for planar or non-planar
pColor = malloc(sizeof(struct Color));
if(isPlanar = [tiff isPlanar]) {
pColor->R = planeData[0];
pColor->G = planeData[1];
pColor->B = planeData[2];
} else {
meshedData = planeData[0];
pColor->R = meshedData;
pColor->G = meshedData+1;
pColor->B = meshedData+2;
}
// ********************* write out the PPM file
writePPM();
// ********************* cleanup ****************************
[tiff free];
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.