CC Localization
tiff.hh
Go to the documentation of this file.
1 
5 #pragma once
6 #include <memory>
7 #include <fstream>
8 #include <vector>
9 #include <tuple>
10 #include <map>
11 
13 class Tiff
14 {
15  std::shared_ptr<std::ifstream> sp;
16  bool le;
17  bool efix;
18  uint32_t ifd;
19  // read from stream
20  uint16_t read16();
21  uint32_t read32();
22 public:
24  struct DEntry
25  {
26  uint16_t tag;
27  uint16_t type;
28  uint32_t count;
29  uint32_t data;
30  };
31 private:
32  DEntry read_dentry(); // endian is corrected
33  uint16_t get16(DEntry const & e) {return le?e.data&0xffff:e.data>>16;} // first uint16
34  uint16_t next16(DEntry const & e) {return le?e.data>>16:e.data&0xffff;} // second uint16
35  uint32_t to32(DEntry const & e);
36  std::string get_str(DEntry const & de);
37  std::vector<uint16_t> get16s(DEntry const & e);
38  std::vector<uint32_t> get32s(DEntry const & e);
39  std::tuple<uint32_t,uint32_t> get_ratio(DEntry const & e);
40 public:
42  Tiff(std::shared_ptr<std::ifstream> s) : sp(s) {}
43  void start();
44  uint32_t parse_ifd(
46  uint32_t i = 0
47  );
48  std::vector<char> read_image();
49  enum Tag {
51  Tag_ImageWidth = 0x100,
52  Tag_ImageLength = 0x101,
53  Tag_BitsPerSample = 0x102,
54  Tag_Compression = 0x103,
55  Tag_PhotometricInterpretation = 0x106,
56  Tag_FillOrder = 0x10a,
57  Tag_ImageDescription = 0x10e,
58  Tag_StripOffsets = 0x111,
59  Tag_Orientation = 0x112,
60  Tag_SamplesPerPixel = 0x115,
61  Tag_RowsPerStrip = 0x116,
62  Tag_StripByteCounts = 0x117,
63  Tag_XResolution = 0x11a,
64  Tag_YResolution = 0x11b,
65  Tag_PlanarConfiguration = 0x11c,
66  Tag_ResolutionUnit = 0x128,
67  Tag_Software = 0x131,
68  Tag_SampleFormat = 0x153,
69  Tag_ImageID = 0x800d
70  };
72  enum Compression {
73  Cmp_None = 1,
74  Cmp_CCITT = 2,
75  Cmp_PackBits = 32773
76  };
78  std::map<Compression,std::string> const compress_name {
79  {Cmp_None,"None"},
80  {Cmp_CCITT,"CCITT"},
81  {Cmp_PackBits,"PackBits"}
82  };
84  enum Photometric {
85  Ptm_WhiteIsZero = 0,
86  Ptm_BlackIsZero = 1,
87  Ptm_RGB = 2,
88  Ptm_Palette = 3,
89  Ptm_TransparencyMask = 4
90  };
92  std::map<Photometric,std::string> const photom_name {
93  {Ptm_WhiteIsZero,"WhiteIsZero"},
94  {Ptm_BlackIsZero,"BlackIsZero"},
95  {Ptm_RGB,"RGB"},
96  {Ptm_Palette,"Palette"},
97  {Ptm_TransparencyMask,"TransparencyMask"}
98  };
100  enum Unit {
101  Unt_None = 1,
102  Unt_Inch = 2,
103  Unt_Centimeter = 3
104  };
106  std::map<Unit,std::string> const unit_name {
107  {Unt_None,"None"},
108  {Unt_Inch,"Inch"},
109  {Unt_Centimeter,"Centimeter"}
110  };
113  Fmt_Unsigned = 1,
114  Fmt_TwoComplement = 2,
115  Fmt_IEEEFloat = 3,
116  Fmt_Undefined = 4
117  };
119  std::map<SampleFormat,std::string> const format_name {
120  {Fmt_Unsigned,"Unsigned"},
121  {Fmt_TwoComplement,"TwoComplement"},
122  {Fmt_IEEEFloat,"IEEEFloat"},
123  {Fmt_Undefined,"Undefined"}
124  };
125  uint32_t image_width;
126  uint32_t image_length;
127  std::vector<uint16_t> bits_per_sample;
130  uint16_t fill_order;
131  std::string image_description;
132  std::vector<uint32_t> strip_offsets;
133  uint16_t orientation;
134  uint16_t samples_per_pixel;
135  uint32_t rows_per_strip;
136  std::vector<uint32_t> strip_byte_counts;
137  std::tuple<uint32_t,uint32_t> xresolution;
138  std::tuple<uint32_t,uint32_t> yresolution;
141  std::string software;
142  std::vector<SampleFormat> sample_formats;
143  std::string image_id;
144 };
std::string image_description
image description
Definition: tiff.hh:131
std::map< SampleFormat, std::string > const format_name
String names for sample formats.
Definition: tiff.hh:119
uint16_t samples_per_pixel
samples per pixel
Definition: tiff.hh:134
std::vector< uint32_t > strip_offsets
strip offsets
Definition: tiff.hh:132
TIFF file processor.
Definition: tiff.hh:13
uint16_t tag
entry name
Definition: tiff.hh:26
std::vector< char > read_image()
Definition: tiff.cc:168
uint32_t image_width
width of image
Definition: tiff.hh:125
std::vector< uint32_t > strip_byte_counts
strip byte counots
Definition: tiff.hh:136
std::vector< SampleFormat > sample_formats
sample formats
Definition: tiff.hh:142
Compression compression
compression method
Definition: tiff.hh:128
uint32_t count
data count
Definition: tiff.hh:28
Unit
Units for image.
Definition: tiff.hh:100
std::map< Photometric, std::string > const photom_name
String names for photometric formats.
Definition: tiff.hh:92
Tiff(std::shared_ptr< std::ifstream > s)
Construct TIFF processor from an input stream.
Definition: tiff.hh:42
std::tuple< uint32_t, uint32_t > yresolution
y resolution
Definition: tiff.hh:138
std::tuple< uint32_t, uint32_t > xresolution
x resolution
Definition: tiff.hh:137
uint32_t image_length
length of image
Definition: tiff.hh:126
std::string software
software used
Definition: tiff.hh:141
Photometric photometric
photometric format
Definition: tiff.hh:129
Unit resolution_unit
unit for image resolution
Definition: tiff.hh:140
std::map< Compression, std::string > const compress_name
String names for compression methods.
Definition: tiff.hh:78
uint16_t planar_configuration
planar configuration
Definition: tiff.hh:139
SampleFormat
Sample formats.
Definition: tiff.hh:112
Photometric
Photometric formats.
Definition: tiff.hh:84
uint16_t fill_order
fill order
Definition: tiff.hh:130
Tag
Directory entry ID tags.
Definition: tiff.hh:50
uint32_t rows_per_strip
rows per strip
Definition: tiff.hh:135
void start()
Definition: tiff.cc:113
uint16_t type
entry data type
Definition: tiff.hh:27
Directory Entry.
Definition: tiff.hh:24
std::map< Unit, std::string > const unit_name
String names for units.
Definition: tiff.hh:106
Compression
Compression methods.
Definition: tiff.hh:72
uint16_t orientation
orientation of image
Definition: tiff.hh:133
std::vector< uint16_t > bits_per_sample
bits per sample
Definition: tiff.hh:127
uint32_t parse_ifd(uint32_t i=0)
Parse image file directory (IFD)
Definition: tiff.cc:127
uint32_t data
data or offset
Definition: tiff.hh:29
std::string image_id
image ID
Definition: tiff.hh:143