Class: Paperclip::Geometry

Inherits:
Object
  • Object
show all
Defined in:
lib/paperclip/geometry.rb

Overview

Defines the geometry of an image.

Constant Summary

EXIF_ROTATED_ORIENTATION_VALUES =
[5, 6, 7, 8]

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (Geometry) initialize(width = nil, height = nil, modifier = nil)

Gives a Geometry representing the given height and width



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/paperclip/geometry.rb', line 10

def initialize(width = nil, height = nil, modifier = nil)
  if width.is_a?(Hash)
    options = width
    @height = options[:height].to_f
    @width = options[:width].to_f
    @modifier = options[:modifier]
    @orientation = options[:orientation].to_i
  else
    @height = height.to_f
    @width  = width.to_f
    @modifier = modifier
  end
end

Instance Attribute Details

- (Object) height

Returns the value of attribute height



5
6
7
# File 'lib/paperclip/geometry.rb', line 5

def height
  @height
end

- (Object) modifier

Returns the value of attribute modifier



5
6
7
# File 'lib/paperclip/geometry.rb', line 5

def modifier
  @modifier
end

- (Object) width

Returns the value of attribute width



5
6
7
# File 'lib/paperclip/geometry.rb', line 5

def width
  @width
end

Class Method Details

+ (Object) from_file(file)

Extracts the Geometry from a file (or path to a file)



25
26
27
# File 'lib/paperclip/geometry.rb', line 25

def self.from_file(file)
  GeometryDetector.new(file).make
end

+ (Object) parse(string)

Extracts the Geometry from a “WxH,O” string Where W is the width, H is the height, and O is the EXIF orientation



32
33
34
# File 'lib/paperclip/geometry.rb', line 32

def self.parse(string)
  GeometryParser.new(string).make
end

Instance Method Details

- (Object) aspect

The aspect ratio of the dimensions.



60
61
62
# File 'lib/paperclip/geometry.rb', line 60

def aspect
  width / height
end

- (Object) auto_orient

Swaps the height and width if necessary



37
38
39
40
41
42
# File 'lib/paperclip/geometry.rb', line 37

def auto_orient
  if EXIF_ROTATED_ORIENTATION_VALUES.include?(@orientation)
    @height, @width = @width, @height
    @orientation -= 4
  end
end

- (Boolean) horizontal?

True if the dimensions represent a horizontal rectangle



50
51
52
# File 'lib/paperclip/geometry.rb', line 50

def horizontal?
  height < width
end

- (Object) inspect

Same as to_s



84
85
86
# File 'lib/paperclip/geometry.rb', line 84

def inspect
  to_s
end

- (Object) larger

Returns the larger of the two dimensions



65
66
67
# File 'lib/paperclip/geometry.rb', line 65

def larger
  [height, width].max
end

- (Object) resize_to(geometry)

resize to a new geometry

Examples:

Paperclip::Geometry.new(150, 150).resize_to('50x50!')
#=> Paperclip::Geometry(50, 50)


112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/paperclip/geometry.rb', line 112

def resize_to(geometry)
  new_geometry = Paperclip::Geometry.parse geometry
  case new_geometry.modifier
  when '!', '#'
    new_geometry
  when '>'
    if new_geometry.width >= self.width && new_geometry.height >= self.height
      self
    else
      scale_to new_geometry
    end
  when '<'
    if new_geometry.width <= self.width || new_geometry.height <= self.height
      self
    else
      scale_to new_geometry
    end
  else
    scale_to new_geometry
  end
end

- (Object) smaller

Returns the smaller of the two dimensions



70
71
72
# File 'lib/paperclip/geometry.rb', line 70

def smaller
  [height, width].min
end

- (Boolean) square?

True if the dimensions represent a square



45
46
47
# File 'lib/paperclip/geometry.rb', line 45

def square?
  height == width
end

- (Object) to_s

Returns the width and height in a format suitable to be passed to Geometry.parse



75
76
77
78
79
80
81
# File 'lib/paperclip/geometry.rb', line 75

def to_s
  s = ""
  s << width.to_i.to_s if width > 0
  s << "x#{height.to_i}" if height > 0
  s << modifier.to_s
  s
end

- (Object) transformation_to(dst, crop = false)

Returns the scaling and cropping geometries (in string-based ImageMagick format) neccessary to transform this Geometry into the Geometry given. If crop is true, then it is assumed the destination Geometry will be the exact final resolution. In this case, the source Geometry is scaled so that an image containing the destination Geometry would be completely filled by the source image, and any overhanging image would be cropped. Useful for square thumbnail images. The cropping is weighted at the center of the Geometry.



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/paperclip/geometry.rb', line 95

def transformation_to dst, crop = false
  if crop
    ratio = Geometry.new( dst.width / self.width, dst.height / self.height )
    scale_geometry, scale = scaling(dst, ratio)
    crop_geometry         = cropping(dst, ratio, scale)
  else
    scale_geometry        = dst.to_s
  end

  [ scale_geometry, crop_geometry ]
end

- (Boolean) vertical?

True if the dimensions represent a vertical rectangle



55
56
57
# File 'lib/paperclip/geometry.rb', line 55

def vertical?
  height > width
end