From 1fd361a1ea06e44286c213ca1f814f49306fdc43 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 19 Aug 2006 03:12:28 +0000 Subject: Create Subversion repository git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/pgm/bioradtopgm.c | 152 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 converter/pgm/bioradtopgm.c (limited to 'converter/pgm/bioradtopgm.c') diff --git a/converter/pgm/bioradtopgm.c b/converter/pgm/bioradtopgm.c new file mode 100644 index 00000000..e0bc3584 --- /dev/null +++ b/converter/pgm/bioradtopgm.c @@ -0,0 +1,152 @@ +/* bioradtopgm.c - convert a Biorad confocal image into a portable graymap +** +** Copyright (C) 1993 by Oliver Trepte, oliver@fysik4.kth.se +** +** Derived from the pbmplus package, +** Copyright (C) 1989 by Jef Poskanzer. +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, provided +** that the above copyright notice appear in all copies and that both that +** copyright notice and this permission notice appear in supporting +** documentation. This software is provided "as is" without express or +** implied warranty. +*/ + +#include + +#include "pgm.h" +#include "nstring.h" + +#define BYTE unsigned char +#define BIORAD_HEADER_LENGTH 76 +#define BYTE_TO_WORD(lsb,msb) (((BYTE) lsb) + (((BYTE) msb) << 8)) + +int +main( argc, argv ) + int argc; + char* argv[]; + { + FILE* ifp; + gray* grayrow; + register gray* gP; + int argn, row, i; + register int col, val, val2; + int rows=0, cols=0, image_num= -1, image_count, byte_word, check_word; + int maxval; + BYTE buf[BIORAD_HEADER_LENGTH]; + const char* const usage = "[-image#] [Bioradfile]"; + + + pgm_init( &argc, argv ); + + argn = 1; + + while ( argn < argc && argv[argn][0] == '-' && argv[argn][1] != '\0' ) + { + if ( ISDIGIT( argv[argn][1] )) + { + image_num = atoi( (argv[argn]+1) ); + } + else + pm_usage( usage ); + ++argn; + } + + if ( argn < argc ) + { + ifp = pm_openr( argv[argn] ); + ++argn; + } + else + ifp = stdin; + + if ( argn != argc ) + pm_usage( usage ); + + for ( i = 0; i < BIORAD_HEADER_LENGTH; ++i ) + { + val = getc( ifp ); + if ( val == EOF ) + pm_error( "EOF / read error" ); + buf[ i ] = val; + } + + cols = BYTE_TO_WORD(buf[0], buf[1]); + rows = BYTE_TO_WORD(buf[2], buf[3]); + image_count = BYTE_TO_WORD(buf[4], buf[5]); + byte_word = BYTE_TO_WORD(buf[14], buf[15]); + check_word = BYTE_TO_WORD(buf[54], buf[55]); + + if ( check_word != 12345 ) + pm_error( "Not a Biorad file" ); + + if ( cols <= 0 ) + pm_error( "Strange image size, cols = %d", cols); + + if ( rows <= 0 ) + pm_error( "Strange image size, rows = %d", rows); + + if ( image_count <= 0 ) + pm_error( "Number of images in file is %d", image_count); + + if ( byte_word ) + maxval = 255; + else + { + maxval = 65535; /* Perhaps this should be something else */ + + } + + pm_message( "Image size: %d cols, %d rows", cols, rows); + pm_message( "%s", + (byte_word) ? "Byte image (8 bits)" : "Word image (16 bits)"); + + if ( image_num < 0 ) + pm_message( "Input contains %d image%c", + image_count, (image_count > 1) ? 's' : '\0'); + else + { + if ( image_num >= image_count ) + pm_error( "Cannot extract image %d, input contains only %d image%s", + image_num, image_count, (image_count > 1) ? "s" : "" ); + for ( i = (byte_word) ? image_num : image_num*2 ; i > 0 ; --i ) { + for ( row = 0; row < rows; ++row) + for ( col = 0; col < cols; ++col ) + { + val = getc( ifp ); + if ( val == EOF ) { + pm_error( "EOF / read error" ); + } + } + } + + pgm_writepgminit( stdout, cols, rows, (gray) maxval, 0 ); + grayrow = pgm_allocrow( cols ); + + for ( row = 0; row < rows; ++row) + { + for ( col = 0, gP = grayrow; col < cols; ++col ) + { + val = getc( ifp ); + if ( val == EOF ) + pm_error( "EOF / read error" ); + if (byte_word) + *gP++ = val; + else + { + val2 = getc( ifp ); + if ( val2 == EOF ) + pm_error( "EOF / read error" ); + *gP++ = BYTE_TO_WORD(val, val2); + } + } + pgm_writepgmrow( stdout, grayrow, cols, (gray) maxval, 0 ); + } + + pm_close( ifp ); + pm_close( stdout ); + + } + exit( 0 ); +} -- cgit 1.4.1