import sys def pgm2ppm(filename, invert): pgm = open(filename,'r') outname = filename + '_out.ppm' ppm = open(outname,'w') line = pgm.readline() # P2 line = pgm.readline() # comment line ppm.write('P3\n') ppm.write('# from %s\n' % filename) line = pgm.readline() # 360 360 ppm.write(line) line = pgm.readline() # maxVal if (line[0] == '#'): ppm.write(line) line = pgm.readline() maxVal = float(line.strip()) if (maxVal == 0): print 'maxVal = 0' pgm.close() ppm.close() sys.exit(0) ppm.write('255\n') for line in pgm.readlines(): line = line.strip() val = float(line) / maxVal if not invert: color = get_color_descending(val) else: color = get_color_ascending(val) ppm.write(color) pgm.close() ppm.close() def get_color_descending(i): # i is an intensity between 0.0 and 1.0 # big values are red. small values are blue. smallest 0.2% are bg. # picks a colour from a spectrum wheel according to value of i # spectrum wheel: # colour = blue-> cyan->green->yellow-> red->magenta->blue # i = 0 ->0.167->0.383-> 0.5 ->0.667-> 0.833 -> 1 if (i < 0.002): return '255 255 255\n' # white bg i = i * 0.7 ang = i * 360. if (ang <= 60): blue = 255 green = int(ang / 60 * 255) red = 0 elif (ang <= 120): blue = int((60-(ang-60)) / 60 * 255) green = 255 red = 0 elif (ang <= 180): blue = 0 green = 255 red = int((ang-120) / 60 * 255) elif (ang <= 240): blue = 0 green = int((60-(ang-180)) / 60 * 255) red = 255 elif (ang <= 300): blue = int((ang-240) / 60 * 255) green = 0 red = 255 else: blue = 255 green = 0 red = int((60-(ang-300)) / 60 * 255) return '%d %d %d\n' % (red, green, blue) def get_color_ascending(i): # small values are red. big values are blue. biggest 0.2% are bg. if (i > (1-0.002)): return '0 0 0\n' # black bg i = i * 0.7 ang = i * 360. if (ang <= 60): red = 255 green = int(ang / 60 * 255) blue = 0 elif (ang <= 120): red = int((60-(ang-60)) / 60 * 255) green = 255 blue = 0 elif (ang <= 180): red = 0 green = 255 blue = int((ang-120) / 60 * 255) elif (ang <= 240): red = 0 green = int((60-(ang-180)) / 60 * 255) blue = 255 elif (ang <= 300): red = int((ang-240) / 60 * 255) green = 0 blue = 255 else: red = 255 green = 0 blue = int((60-(ang-300)) / 60 * 255) return '%d %d %d\n' % (red, green, blue) if (__name__ == '__main__'): if ('-invert' in sys.argv): argNum = 3 invert = 1 else: argNum = 2 invert = 0 if (len(sys.argv) < argNum): print 'Usage: python pgm2ppm.py listfile.txt [-invert]' sys.exit(0) fopen = open(sys.argv[1],'r') for line in fopen.readlines(): line = line.strip() print line pgm2ppm(line, invert) fopen.close()