1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
#------------------------------------------------------------------------------
# File: InfiRay.pm
#
# Description: InfiRay IJPEG thermal image metadata
#
# Revisions: 2023-02-08 - M. Del Sol Created
#
# References: 1) https://github.com/exiftool/exiftool/pull/184
#
# Notes: Information in this document has been mostly gathered by
# disassembling the P2 Pro Android app, version 1.0.8.230111.
#------------------------------------------------------------------------------
package Image::ExifTool::InfiRay;
use strict;
use vars qw($VERSION);
$VERSION = '1.00';
my %convFloat2 = ( PrintConv => 'sprintf("%.2f", $val)' );
my %convPercent = ( PrintConv => 'sprintf("%.1f %%", $val * 100)' );
my %convMeters = ( PrintConv => 'sprintf("%.2f m", $val)' );
my %convCelsius = ( PrintConv => 'sprintf("%.2f C", $val)' );
# InfiRay IJPEG version header, found in JPEGs APP2
%Image::ExifTool::InfiRay::Version = (
GROUPS => { 0 => 'APP2', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP2 IJPEG version header, found
in JPEGs taken with the P2 Pro camera app.
},
0x00 => { Name => 'IJPEGVersion', Format => 'int8u[4]' },
# 0x04 => { Name => 'IJPEGSignature', Format => 'string[6]' }, # "IJPEG\0"
0x0c => { Name => 'IJPEGOrgType', Format => 'int8u' },
0x0d => { Name => 'IJPEGDispType', Format => 'int8u' },
0x0e => { Name => 'IJPEGRotate', Format => 'int8u' },
0x0f => { Name => 'IJPEGMirrorFlip', Format => 'int8u' },
0x10 => { Name => 'ImageColorSwitchable', Format => 'int8u' },
0x11 => { Name => 'ThermalColorPalette', Format => 'int16u' },
0x20 => { Name => 'IRDataSize', Format => 'int64u' },
0x28 => { Name => 'IRDataFormat', Format => 'int16u' },
0x2a => { Name => 'IRImageWidth', Format => 'int16u' },
0x2c => { Name => 'IRImageHeight', Format => 'int16u' },
0x2e => { Name => 'IRImageBpp', Format => 'int8u' },
0x30 => { Name => 'TempDataSize', Format => 'int64u' },
0x38 => { Name => 'TempDataFormat', Format => 'int16u' },
0x3a => { Name => 'TempImageWidth', Format => 'int16u' },
0x3c => { Name => 'TempImageHeight', Format => 'int16u' },
0x3e => { Name => 'TempImageBpp', Format => 'int8u' },
0x40 => { Name => 'VisibleDataSize', Format => 'int64u' },
0x48 => { Name => 'VisibleDataFormat', Format => 'int16u' },
0x4a => { Name => 'VisibleImageWidth', Format => 'int16u' },
0x4c => { Name => 'VisibleImageHeight', Format => 'int16u' },
0x4e => { Name => 'VisibleImageBpp', Format => 'int8u' },
);
# InfiRay IJPEG factory temperature, found in IJPEG's APP4 section
%Image::ExifTool::InfiRay::Factory = (
GROUPS => { 0 => 'APP4', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP4 IJPEG camera factory
defaults and calibration data.
},
0x00 => { Name => 'IJPEGTempVersion', Format => 'int8u[4]' },
0x04 => { Name => 'FactDefEmissivity', Format => 'int8s' },
0x05 => { Name => 'FactDefTau', Format => 'int8s' },
0x06 => { Name => 'FactDefTa', Format => 'int16s' },
0x08 => { Name => 'FactDefTu', Format => 'int16s' },
0x0a => { Name => 'FactDefDist', Format => 'int16s' },
0x0c => { Name => 'FactDefA0', Format => 'int32s' },
0x10 => { Name => 'FactDefB0', Format => 'int32s' },
0x14 => { Name => 'FactDefA1', Format => 'int32s' },
0x18 => { Name => 'FactDefB1', Format => 'int32s' },
0x1c => { Name => 'FactDefP0', Format => 'int32s' },
0x20 => { Name => 'FactDefP1', Format => 'int32s' },
0x24 => { Name => 'FactDefP2', Format => 'int32s' },
0x44 => { Name => 'FactRelSensorTemp', Format => 'int16s' },
0x46 => { Name => 'FactRelShutterTemp', Format => 'int16s' },
0x48 => { Name => 'FactRelLensTemp', Format => 'int16s' },
0x64 => { Name => 'FactStatusGain', Format => 'int8s' },
0x65 => { Name => 'FactStatusEnvOK', Format => 'int8s' },
0x66 => { Name => 'FactStatusDistOK', Format => 'int8s' },
0x67 => { Name => 'FactStatusTempMap', Format => 'int8s' },
# Missing: ndist_table_len, ndist_table, nuc_t_table_len, nuc_t_table
);
# InfiRay IJPEG picture temperature information, found in IJPEG's APP5 section
%Image::ExifTool::InfiRay::Picture = (
GROUPS => { 0 => 'APP5', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP5 IJPEG picture temperature
information.
},
0x00 => { Name => 'EnvironmentTemp', Format => 'float', %convCelsius },
0x04 => { Name => 'Distance', Format => 'float', %convMeters },
0x08 => { Name => 'Emissivity', Format => 'float', %convFloat2 },
0x0c => { Name => 'Humidity', Format => 'float', %convPercent },
0x10 => { Name => 'ReferenceTemp', Format => 'float', %convCelsius },
0x20 => { Name => 'TempUnit', Format => 'int8u' },
0x21 => { Name => 'ShowCenterTemp', Format => 'int8u' },
0x22 => { Name => 'ShowMaxTemp', Format => 'int8u' },
0x23 => { Name => 'ShowMinTemp', Format => 'int8u' },
0x24 => { Name => 'TempMeasureCount', Format => 'int16u' },
# TODO: process extra measurements list
);
# InfiRay IJPEG visual-infrared mixing mode, found in IJPEG's APP6 section
%Image::ExifTool::InfiRay::MixMode = (
GROUPS => { 0 => 'APP6', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP6 IJPEG visual-infrared mixing
mode section.
},
0x00 => { Name => 'MixMode', Format => 'int8u' },
0x01 => { Name => 'FusionIntensity', Format => 'float', %convPercent },
0x05 => { Name => 'OffsetAdjustment', Format => 'float' },
0x09 => { Name => 'CorrectionAsix', Format => 'float[30]' },
);
# InfiRay IJPEG camera operation mode, found in IJPEG's APP7 section
#
# I do not know in what units these times are, or what do they represent.
%Image::ExifTool::InfiRay::OpMode = (
GROUPS => { 0 => 'APP7', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP7 IJPEG camera operation mode
section.
},
0x00 => { Name => 'WorkingMode', Format => 'int8u' },
0x01 => { Name => 'IntegralTime', Format => 'int32u' },
0x05 => { Name => 'IntegratTimeHdr', Format => 'int32u' },
0x09 => { Name => 'GainStable', Format => 'int8u' },
0x0a => { Name => 'TempControlEnable', Format => 'int8u' },
0x0b => { Name => 'DeviceTemp', Format => 'float', %convCelsius },
);
# InfiRay IJPEG isothermal information, found in IJPEG's APP8 section
#
# I have genuinely no clue what is the meaning of any of this information, or
# what is it used for.
%Image::ExifTool::InfiRay::Isothermal = (
GROUPS => { 0 => 'APP8', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP8 IJPEG picture isothermal
information.
},
0x00 => { Name => 'IsothermalMax', Format => 'float' },
0x04 => { Name => 'IsothermalMin', Format => 'float' },
0x08 => { Name => 'ChromaBarMax', Format => 'float' },
0x0c => { Name => 'ChromaBarMin', Format => 'float' },
);
# InfiRay IJPEG sensor information, found in IJPEG's APP9 section
%Image::ExifTool::InfiRay::Sensor = (
GROUPS => { 0 => 'APP9', 2 => 'Image' },
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
NOTES => q{
This table lists tags found in the InfiRay APP9 IJPEG sensor information
chunk.
},
0x000 => { Name => 'IRSensorManufacturer', Format => 'string[12]' },
0x040 => { Name => 'IRSensorName', Format => 'string[12]' },
0x080 => { Name => 'IRSensorPartNumber', Format => 'string[32]' },
0x0c0 => { Name => 'IRSensorSerialNumber', Format => 'string[32]' },
0x100 => { Name => 'IRSensorFirmware', Format => 'string[12]' },
0x140 => { Name => 'IRSensorAperture', Format => 'float', %convFloat2 },
0x144 => { Name => 'IRFocalLength', Format => 'float', %convFloat2 },
0x180 => { Name => 'VisibleSensorManufacturer', Format => 'string[12]' },
0x1c0 => { Name => 'VisibleSensorName', Format => 'string[12]' },
0x200 => { Name => 'VisibleSensorPartNumber', Format => 'string[32]' },
0x240 => { Name => 'VisibleSensorSerialNumber', Format => 'string[32]' },
0x280 => { Name => 'VisibleSensorFirmware', Format => 'string[12]' },
0x2c0 => { Name => 'VisibleSensorAperture', Format => 'float' },
0x2c4 => { Name => 'VisibleFocalLength', Format => 'float' },
);
__END__
=head1 NAME
Image::ExifTool::InfiRay - InfiRay IJPEG thermal image metadata
=head1 SYNOPSIS
This module is loaded automatically by Image::ExifTool when required.
=head1 DESCRIPTION
This module contains definitions required by Image::ExifTool to interpret
metadata and thermal-related information of pictures saved by the InfiRay
IJPEG SDK, used in cameras such as the P2 Pro.
=head1 AUTHOR
Copyright 2003-2023, Marcos Del Sol Vives (marcos at orca.pet)
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=head1 REFERENCES
=over 4
=item L<https://github.com/exiftool/exiftool/pull/184>
=back
=head1 SEE ALSO
L<Image::ExifTool::TagNames/InfiRay Tags>,
L<Image::ExifTool(3pm)|Image::ExifTool>
=cut
|