Class: Pruim::PBM

Inherits:
Object
  • Object
show all
Includes:
Codec
Defined in:
lib/pruim/pbm.rb

Overview

Tiny PBM parser integrated with Prium codecs.

Instance Method Summary collapse

Methods included from Codec

for_filename, for_filename_name, for_name, new_for_filename, new_for_filename_name, new_for_name, register, #text

Instance Method Details

#can_decode?(stream) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
58
# File 'lib/pruim/pbm.rb', line 54

def can_decode?(stream)
  header = stream.gets
  stream.rewind
  return header == "P1\n"
end

#can_encode?(image) ⇒ Boolean

Can only encode monocrome images.

Returns:

  • (Boolean)


61
62
63
# File 'lib/pruim/pbm.rb', line 61

def can_encode?(image)      
  return image.mode == :monochrome
end

#decode(stream) ⇒ Object

Read in a pbm file from an io object.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/pruim/pbm.rb', line 10

def decode(stream)
  header    = stream.gets
  lines     = []
  until stream.eof?
    lines << stream.gets
  end
  data      = []
  image   = nil
  page    = nil
  w, h    = nil, nil
  y       = 0
  comment = ''
  lines.each do |line|
    if line[0] == '#'
      comment << line.chomp.sub(/\A#/, '')
      next
    end
    if !w
      w , h = line.chomp.split(' ').map { |v| v.to_i }
      next
    end
    # Converts 1 to true, rest to false.
    bits = line.chomp.split('').map { |v| (v == '1') }
    data += bits
  end
  image = Image.new(w, h, :mode => :monochrome, :data => data)
  image.comment = comment
  return image
end

#encode(image, stream) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/pruim/pbm.rb', line 40

def encode(image, stream)
  stream.puts("P1")
  stream.puts("##{image.comment}") if image.comment
  stream.puts("#{image.w} #{image.h}")
  page = image.pages.first
  for y in (0...page.h) do
    for x in (0...page.w) do
      white   = page.getpixel!(x, y)
      stream.write(white ? '1' : '0')
    end
    stream.puts()
  end
end

#encode_will_degrade?(image) ⇒ Boolean

Will only save first page of image.

Returns:

  • (Boolean)


66
67
68
# File 'lib/pruim/pbm.rb', line 66

def encode_will_degrade?(image)
  return (image.pages.size > 1)
end