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…
Reference in New Issue
Block a user