Class: Lipsiadmin::Attachment::Geometry

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

Overview

Defines the geometry of an image.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(width = nil, height = nil, modifier = nil) ⇒ Geometry

Gives a Geometry representing the given height and width



9
10
11
12
13
# File 'lib/data_base/attachment/geometry.rb', line 9

def initialize(width = nil, height = nil, modifier = nil)
  @height = height.to_f
  @width  = width.to_f
  @modifier = modifier
end

Instance Attribute Details

#heightObject

Returns the value of attribute height.



6
7
8
# File 'lib/data_base/attachment/geometry.rb', line 6

def height
  @height
end

#modifierObject

Returns the value of attribute modifier.



6
7
8
# File 'lib/data_base/attachment/geometry.rb', line 6

def modifier
  @modifier
end

#widthObject

Returns the value of attribute width.



6
7
8
# File 'lib/data_base/attachment/geometry.rb', line 6

def width
  @width
end

Class Method Details

.from_file(file) ⇒ Object

Uses ImageMagick to determing the dimensions of a file, passed in as either a File or path.



17
18
19
20
21
22
23
24
25
26
# File 'lib/data_base/attachment/geometry.rb', line 17

def self.from_file(file)
  file = file.path if file.respond_to? "path"
  geometry = begin
               Attachment.run("identify", %Q[-format "%wx%h" "#{file}"[0]])
             rescue AttachmentCommandLineError
               ""
             end
  parse(geometry) ||
    raise(NotIdentifiedByImageMagickError.new("#{file} is not recognized by the 'identify' command."))
end

.parse(string) ⇒ Object

Parses a “WxH” formatted string, where W is the width and H is the height.



29
30
31
32
33
# File 'lib/data_base/attachment/geometry.rb', line 29

def self.parse(string)
  if match = (string && string.match(/\b(\d*)x?(\d*)\b([\>\<\#\@\%^!])?/))
    Geometry.new(*match[1,3])
  end
end

Instance Method Details

#aspectObject

The aspect ratio of the dimensions.



51
52
53
# File 'lib/data_base/attachment/geometry.rb', line 51

def aspect
  width / height
end

#horizontal?Boolean

True if the dimensions represent a horizontal rectangle



41
42
43
# File 'lib/data_base/attachment/geometry.rb', line 41

def horizontal?
  height < width
end

#inspectObject

Same as to_s



75
76
77
# File 'lib/data_base/attachment/geometry.rb', line 75

def inspect
  to_s
end

#largerObject

Returns the larger of the two dimensions



56
57
58
# File 'lib/data_base/attachment/geometry.rb', line 56

def larger
  [height, width].max
end

#smallerObject

Returns the smaller of the two dimensions



61
62
63
# File 'lib/data_base/attachment/geometry.rb', line 61

def smaller
  [height, width].min
end

#square?Boolean

True if the dimensions represent a square



36
37
38
# File 'lib/data_base/attachment/geometry.rb', line 36

def square?
  height == width
end

#to_sObject

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



66
67
68
69
70
71
72
# File 'lib/data_base/attachment/geometry.rb', line 66

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

#transformation_to(dst, crop = false) ⇒ Object

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.



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/data_base/attachment/geometry.rb', line 86

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

#vertical?Boolean

True if the dimensions represent a vertical rectangle



46
47
48
# File 'lib/data_base/attachment/geometry.rb', line 46

def vertical?
  height > width
end