jpeginfo: decode basic TIFF tag names
This commit is contained in:
		
							parent
							
								
									46c46ac093
								
							
						
					
					
						commit
						06779c6bdd
					
				
							
								
								
									
										129
									
								
								tools/jpeginfo.c
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								tools/jpeginfo.c
									
									
									
									
									
								
							| @ -324,6 +324,120 @@ tiffer_next_entry(struct tiffer *self, struct tiffer_entry *entry) | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| // --- TIFF/Exif/MPF/* tags ----------------------------------------------------
 | ||||
| 
 | ||||
| struct tiff_entry { | ||||
| 	const char *name; | ||||
| 	uint16_t tag; | ||||
| }; | ||||
| 
 | ||||
| static struct tiff_entry tiff_entries[] = { | ||||
| 	{"NewSubfileType", 254}, | ||||
| 	{"SubfileType", 255}, | ||||
| 	{"ImageWidth", 256}, | ||||
| 	{"ImageLength", 257}, | ||||
| 	{"BitsPerSample", 258}, | ||||
| 	{"Compression", 259}, | ||||
| 	{"PhotometricInterpretation", 262}, | ||||
| 	{"Threshholding", 263}, | ||||
| 	{"CellWidth", 264}, | ||||
| 	{"CellLength", 265}, | ||||
| 	{"FillOrder", 266}, | ||||
| 	{"DocumentName", 269}, | ||||
| 	{"ImageDescription", 270}, | ||||
| 	{"Make", 271}, | ||||
| 	{"Model", 272}, | ||||
| 	{"StripOffsets", 273}, | ||||
| 	{"Orientation", 274}, | ||||
| 	{"SamplesPerPixel", 277}, | ||||
| 	{"RowsPerStrip", 278}, | ||||
| 	{"StripByteCounts", 279}, | ||||
| 	{"MinSampleValue", 280}, | ||||
| 	{"MaxSampleValue", 281}, | ||||
| 	{"XResolution", 282}, | ||||
| 	{"YResolution", 283}, | ||||
| 	{"PlanarConfiguration", 284}, | ||||
| 	{"PageName", 285}, | ||||
| 	{"XPosition", 286}, | ||||
| 	{"YPosition", 287}, | ||||
| 	{"FreeOffsets", 288}, | ||||
| 	{"FreeByteCounts", 289}, | ||||
| 	{"GrayResponseUnit", 290}, | ||||
| 	{"GrayResponseCurve", 291}, | ||||
| 	{"T4Options", 292}, | ||||
| 	{"T6Options", 293}, | ||||
| 	{"ResolutionUnit", 296}, | ||||
| 	{"PageNumber", 297}, | ||||
| 	{"TransferFunction", 301}, | ||||
| 	{"Software", 305}, | ||||
| 	{"DateTime", 306}, | ||||
| 	{"Artist", 315}, | ||||
| 	{"HostComputer", 316}, | ||||
| 	{"Predictor", 317}, | ||||
| 	{"WhitePoint", 318}, | ||||
| 	{"PrimaryChromaticities", 319}, | ||||
| 	{"ColorMap", 320}, | ||||
| 	{"HalftoneHints", 321}, | ||||
| 	{"TileWidth", 322}, | ||||
| 	{"TileLength", 323}, | ||||
| 	{"TileOffsets", 324}, | ||||
| 	{"TileByteCounts", 325}, | ||||
| 	{"InkSet", 332}, | ||||
| 	{"InkNames", 333}, | ||||
| 	{"NumberOfInks", 334}, | ||||
| 	{"DotRange", 336}, | ||||
| 	{"TargetPrinter", 337}, | ||||
| 	{"ExtraSamples", 338}, | ||||
| 	{"SampleFormat", 339}, | ||||
| 	{"SMinSampleValue", 340}, | ||||
| 	{"SMaxSampleValue", 341}, | ||||
| 	{"TransferRange", 342}, | ||||
| 	{"JPEGProc", 512}, | ||||
| 	{"JPEGInterchangeFormat", 513}, | ||||
| 	{"JPEGInterchangeFormatLngth", 514}, | ||||
| 	{"JPEGRestartInterval", 515}, | ||||
| 	{"JPEGLosslessPredictors", 517}, | ||||
| 	{"JPEGPointTransforms", 518}, | ||||
| 	{"JPEGQTables", 519}, | ||||
| 	{"JPEGDCTables", 520}, | ||||
| 	{"JPEGACTables", 521}, | ||||
| 	{"YCbCrCoefficients", 529}, | ||||
| 	{"YCbCrSubSampling", 530}, | ||||
| 	{"YCbCrPositioning", 531}, | ||||
| 	{"ReferenceBlackWhite", 532}, | ||||
| 	{"Copyright", 33432}, | ||||
| 	{} | ||||
| }; | ||||
| 
 | ||||
| // Compression
 | ||||
| static struct tiff_entry tiff_compression_values[] = { | ||||
| 	{"Uncompressed", 1}, | ||||
| 	{"CCITT 1D", 2}, | ||||
| 	{"Group 3 Fax", 3}, | ||||
| 	{"Group 4 Fax", 4}, | ||||
| 	{"LZW", 5}, | ||||
| 	{"JPEG", 6}, | ||||
| 	{"PackBits", 32773}, | ||||
| 	{} | ||||
| }; | ||||
| 
 | ||||
| // PhotometricInterpretation
 | ||||
| static struct tiff_entry tiff_photometric_interpretation_values[] = { | ||||
| 	{"WhiteIsZero", 0}, | ||||
| 	{"BlackIsZero", 1}, | ||||
| 	{"RGB", 2}, | ||||
| 	{"RGB Palette", 3}, | ||||
| 	{"Transparency mask", 4}, | ||||
| 	{"CMYK", 5}, | ||||
| 	{"YCbCr", 6}, | ||||
| 	{"CIELab", 8}, | ||||
| 	{} | ||||
| }; | ||||
| 
 | ||||
| // TODO(p): Insert tags and values from other documentation,
 | ||||
| // so far only Appendix A from TIFF 6.0 is present.
 | ||||
| // There are still quite a few missing constant names from there.
 | ||||
| 
 | ||||
| // --- Analysis ----------------------------------------------------------------
 | ||||
| 
 | ||||
| static jv | ||||
| @ -351,6 +465,17 @@ add_error(jv o, const char *message) | ||||
| 
 | ||||
| // --- Exif --------------------------------------------------------------------
 | ||||
| 
 | ||||
| // TODO(p): Decode more and better.
 | ||||
| static jv | ||||
| process_exif_entry(jv o, const struct tiffer_entry *entry) | ||||
| { | ||||
| 	for (const struct tiff_entry *p = tiff_entries; p->name; p++) { | ||||
| 		if (p->tag == entry->tag) | ||||
| 			return add_to_subarray(o, "TIFF", jv_string(p->name)); | ||||
| 	} | ||||
| 	return add_to_subarray(o, "TIFF", jv_number(entry->tag)); | ||||
| } | ||||
| 
 | ||||
| static jv | ||||
| parse_exif(jv o, const uint8_t *p, size_t len) | ||||
| { | ||||
| @ -358,11 +483,11 @@ parse_exif(jv o, const uint8_t *p, size_t len) | ||||
| 	if (!tiffer_init(&T, p, len)) | ||||
| 		return add_warning(o, "invalid Exif"); | ||||
| 
 | ||||
| 	// TODO(p): Decode more and better.
 | ||||
| 	// TODO(p): Turn this into an array of objects indexed by tag name.
 | ||||
| 	struct tiffer_entry entry; | ||||
| 	while (tiffer_next_ifd(&T)) { | ||||
| 		while (tiffer_next_entry(&T, &entry)) { | ||||
| 			o = add_to_subarray(o, "TIFF", jv_number(entry.tag)); | ||||
| 			o = process_exif_entry(o, &entry); | ||||
| 		} | ||||
| 	} | ||||
| 	return o; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user