Class: PNM::Image

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

Overview

Abstract base class for PBM, PGM, and PPM images.

Images can be created from pixel values, see PNM.create, or read from a file or I/O stream, see PNM.read.

See PNM module for examples.

Direct Known Subclasses

PBMImage, PGMImage, PPMImage

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#commentObject (readonly)

An optional multiline comment string (or nil).



33
34
35
# File 'lib/pnm/image.rb', line 33

def comment
  @comment
end

#heightObject (readonly)

The height of the image in pixels.



22
23
24
# File 'lib/pnm/image.rb', line 22

def height
  @height
end

#maxgrayObject (readonly)

The maximum gray or color value (for PBM always set to 1). See PNM.create for details.



26
27
28
# File 'lib/pnm/image.rb', line 26

def maxgray
  @maxgray
end

#pixelsObject (readonly)

The pixel data, given as a two-dimensional array. See PNM.create for details.



30
31
32
# File 'lib/pnm/image.rb', line 30

def pixels
  @pixels
end

#widthObject (readonly)

The width of the image in pixels.



19
20
21
# File 'lib/pnm/image.rb', line 19

def width
  @width
end

Class Method Details

.create(pixels, type: nil, maxgray: nil, comment: nil) ⇒ Object

Creates an image from a two-dimensional array of bilevel, gray, or RGB values.

This method should be called as PNM.create. See there for a description of pixel data formats and available options.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/pnm/image.rb', line 41

def self.create(pixels, type: nil, maxgray: nil, comment: nil)
  assert_valid_array(pixels)
  assert_valid_maxgray(maxgray)
  assert_valid_comment(comment)

  type = sanitize_and_assert_valid_type(type)
  type ||= detect_type(pixels, maxgray)

  # except for type detection, the maxgray option must be ignored for PBM
  maxgray = nil  if type == :pbm

  image_class = case type
                when :pbm
                  PBMImage
                when :pgm
                  PGMImage
                when :ppm
                  PPMImage
                end

  image_class.new(pixels, maxgray, comment)
end

Instance Method Details

#==(other) ⇒ Object

Equality — Two images are considered equal if they have the same pixel values, type, maxgray, and comments.



127
128
129
130
131
132
# File 'lib/pnm/image.rb', line 127

def ==(other)
  return true  if other.equal?(self)
  return false  unless other.instance_of?(self.class)

  type == other.type && maxgray == other.maxgray && comment == other.comment && pixels == other.pixels
end

#infoObject Also known as: to_s

Returns a string with a short image format description.



114
115
116
# File 'lib/pnm/image.rb', line 114

def info
  "#{type.to_s.upcase} #{width}x#{height} #{type_string}"
end

#inspectObject

Returns a string representation for debugging.



121
122
123
# File 'lib/pnm/image.rb', line 121

def inspect
  # implemented by subclasses
end

#typeObject

The type of the image. See PNM.create for details.



14
15
16
# File 'lib/pnm/image.rb', line 14

def type
  # implemented by subclasses
end

#write(file, add_extension: false, encoding: :binary) ⇒ Object

Writes the image to file (a filename or an IO object).

When add_extension is set to true (default: false) the appropriate file extension is added to the provided filename (.pbm, .pgm, or .ppm).

The encoding can be set using the encoding keyword argument, valid options are :binary (default) and :ascii.

Returns the number of bytes written.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/pnm/image.rb', line 96

def write(file, add_extension: false, encoding: :binary)
  content = case encoding
            when :ascii
              to_ascii
            when :binary
              to_binary
            end

  if file.is_a?(String)
    filename = add_extension ? "#{file}.#{type}" : file
    File.binwrite(filename, content)
  else
    file.binmode
    file.write content
  end
end