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
63
64
65
66
# 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 = if type == :pbm
              nil
            else
              maxgray
            end

  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.



130
131
132
133
134
135
# File 'lib/pnm/image.rb', line 130

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.



117
118
119
# File 'lib/pnm/image.rb', line 117

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

#inspectObject

Returns a string representation for debugging.



124
125
126
# File 'lib/pnm/image.rb', line 124

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.



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/pnm/image.rb', line 100

def write(file, add_extension: false, encoding: :binary)
  content = if encoding == :ascii
              to_ascii
            elsif encoding == :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