Class: MiniMagick::Image::Info

Inherits:
Object
  • Object
show all
Defined in:
lib/mini_magick/image/info.rb

Constant Summary collapse

ASCII_ENCODED_EXIF_KEYS =
%w[ExifVersion FlashPixVersion]

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Info

Returns a new instance of Info.



9
10
11
12
# File 'lib/mini_magick/image/info.rb', line 9

def initialize(path)
  @path = path
  @info = {}
end

Instance Method Details

#[](value, *args) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/mini_magick/image/info.rb', line 14

def [](value, *args)
  case value
  when "format", "width", "height", "dimensions", "size", "human_size"
    cheap_info(value)
  when "colorspace"
    colorspace
  when "resolution"
    resolution(*args)
  when "signature"
    signature
  when /^EXIF\:/i
    raw_exif(value)
  when "exif"
    exif
  when "data"
    data
  else
    raw(value)
  end
end

#cheap_info(value) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/mini_magick/image/info.rb', line 39

def cheap_info(value)
  @info.fetch(value) do
    format, width, height, size = parse_warnings(self["%m %w %h %b"]).split(" ")

    path = @path
    path = path.match(/\[\d+\]$/).pre_match if path =~ /\[\d+\]$/

    @info.update(
      "format"     => format,
      "width"      => Integer(width),
      "height"     => Integer(height),
      "dimensions" => [Integer(width), Integer(height)],
      "size"       => File.size(path),
      "human_size" => size,
    )

    @info.fetch(value)
  end
rescue ArgumentError, TypeError
  raise MiniMagick::Invalid, "image data can't be read"
end

#clearObject



35
36
37
# File 'lib/mini_magick/image/info.rb', line 35

def clear
  @info.clear
end

#colorspaceObject



71
72
73
# File 'lib/mini_magick/image/info.rb', line 71

def colorspace
  @info["colorspace"] ||= self["%r"]
end

#dataObject



116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/mini_magick/image/info.rb', line 116

def data
  @info["data"] ||= (
    json = MiniMagick.convert do |convert|
      convert << path
      convert << "json:"
    end

    data = JSON.parse(json)
    data = data.fetch(0) if data.is_a?(Array)
    data.fetch("image")
  )
end

#exifObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/mini_magick/image/info.rb', line 87

def exif
  @info["exif"] ||= (
    hash = {}
    output = self["%[EXIF:*]"]

    output.each_line do |line|
      line = line.chomp("\n")

      if match = line.match(/^exif:/)
        key, value = match.post_match.split("=", 2)
        value = decode_comma_separated_ascii_characters(value) if ASCII_ENCODED_EXIF_KEYS.include?(key)
        hash[key] = value
      else
        hash[hash.keys.last] << "\n#{line}"
      end
    end

    hash
  )
end

#identifyObject



129
130
131
132
133
134
# File 'lib/mini_magick/image/info.rb', line 129

def identify
  MiniMagick.identify do |builder|
    yield builder if block_given?
    builder << path
  end
end

#parse_warnings(raw_info) ⇒ Object

Raises:

  • (TypeError)


61
62
63
64
65
66
67
68
69
# File 'lib/mini_magick/image/info.rb', line 61

def parse_warnings(raw_info)
  return raw_info unless raw_info.split("\n").size > 1

  raw_info.split("\n").each do |line|
    # must match "%m %w %h %b"
    return line if line.match?(/^[A-Z]+ \d+ \d+ \d+(|\.\d+)([KMGTPEZY]{0,1})B$/)
  end
  raise TypeError
end

#raw(value) ⇒ Object



108
109
110
# File 'lib/mini_magick/image/info.rb', line 108

def raw(value)
  @info["raw:#{value}"] ||= identify { |b| b.format(value) }
end

#raw_exif(value) ⇒ Object



83
84
85
# File 'lib/mini_magick/image/info.rb', line 83

def raw_exif(value)
  self["%[#{value}]"]
end

#resolution(unit = nil) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/mini_magick/image/info.rb', line 75

def resolution(unit = nil)
  output = identify do |b|
    b.units unit if unit
    b.format "%x %y"
  end
  output.split(" ").map(&:to_i)
end

#signatureObject



112
113
114
# File 'lib/mini_magick/image/info.rb', line 112

def signature
  @info["signature"] ||= self["%#"]
end