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
|
# File 'lib/pura/tiff/encoder.rb', line 19
def encode
out = String.new(encoding: Encoding::BINARY)
pixel_data = @pixels
strip_byte_count = pixel_data.bytesize
tags = []
tags << make_tag(256, TYPE_LONG, 1, [@width])
tags << make_tag(257, TYPE_LONG, 1, [@height])
tags << make_tag(258, TYPE_SHORT, 3, [8, 8, 8])
tags << make_tag(259, TYPE_SHORT, 1, [1])
tags << make_tag(262, TYPE_SHORT, 1, [2])
tags << make_tag(273, TYPE_LONG, 1, [0])
tags << make_tag(277, TYPE_SHORT, 1, [3])
tags << make_tag(278, TYPE_LONG, 1, [@height])
tags << make_tag(279, TYPE_LONG, 1, [strip_byte_count])
tags << make_tag(282, TYPE_RATIONAL, 1, [72, 1])
tags << make_tag(283, TYPE_RATIONAL, 1, [72, 1])
tags << make_tag(296, TYPE_SHORT, 1, [2])
tags.sort_by! { |t| t[:id] }
num_tags = tags.size
ifd_offset = 8
ifd_size = 2 + (num_tags * 12) + 4
overflow_offset = ifd_offset + ifd_size
overflow_data = String.new(encoding: Encoding::BINARY)
tags.each do |tag|
value_bytes = tag_value_bytes(tag)
if value_bytes.bytesize > 4
tag[:value_offset] = overflow_offset + overflow_data.bytesize
overflow_data << value_bytes
else
tag[:value_offset] = nil
end
end
pixel_offset = overflow_offset + overflow_data.bytesize
strip_tag = tags.find { |t| t[:id] == 273 }
strip_tag[:values] = [pixel_offset]
out << "II"
out << [42].pack("v")
out << [ifd_offset].pack("V")
out << [num_tags].pack("v")
tags.each do |tag|
out << [tag[:id]].pack("v")
out << [tag[:type]].pack("v")
out << [tag[:count]].pack("V")
value_bytes = tag_value_bytes(tag)
if value_bytes.bytesize > 4
out << [tag[:value_offset]].pack("V")
else
padded = value_bytes + ("\x00".b * (4 - value_bytes.bytesize))
out << padded
end
end
out << [0].pack("V")
out << overflow_data
out << pixel_data
out
end
|