Class: Prawn::Images::JPG

Inherits:
Object
  • Object
show all
Defined in:
lib/prawn/images/jpg.rb

Overview

A convenience class that wraps the logic for extracting the parts of a JPG image that we need to embed them in a PDF

Constant Summary collapse

JPEG_SOF_BLOCKS =
%W(\xc0 \xc1 \xc2 \xc3 \xc5 \xc6 \xc7 \xc9 \xca \xcb \xcd \xce \xcf)
JPEG_APP_BLOCKS =
%W(\xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ JPG

Process a new JPG image

:data

A binary string of JPEG data



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/prawn/images/jpg.rb', line 27

def initialize(data)
  @data = data
  data = StringIO.new(data.dup)

  c_marker = "\xff" # Section marker.
  data.read(2)   # Skip the first two bytes of JPEG identifier.
  loop do
    marker, code, length = data.read(4).unpack('aan')
    raise "JPEG marker not found!" if marker != c_marker

    if JPEG_SOF_BLOCKS.include?(code)
      @bits, @height, @width, @channels = data.read(6).unpack("CnnC")
      break
    end

    buffer = data.read(length - 2)
  end
end

Instance Attribute Details

#bitsObject (readonly)

Returns the value of attribute bits.



17
18
19
# File 'lib/prawn/images/jpg.rb', line 17

def bits
  @bits
end

#channelsObject (readonly)

Returns the value of attribute channels.



17
18
19
# File 'lib/prawn/images/jpg.rb', line 17

def channels
  @channels
end

#heightObject (readonly)

Returns the value of attribute height.



17
18
19
# File 'lib/prawn/images/jpg.rb', line 17

def height
  @height
end

#scaled_heightObject

Returns the value of attribute scaled_height.



18
19
20
# File 'lib/prawn/images/jpg.rb', line 18

def scaled_height
  @scaled_height
end

#scaled_widthObject

Returns the value of attribute scaled_width.



18
19
20
# File 'lib/prawn/images/jpg.rb', line 18

def scaled_width
  @scaled_width
end

#widthObject (readonly)

Returns the value of attribute width.



17
18
19
# File 'lib/prawn/images/jpg.rb', line 17

def width
  @width
end

Instance Method Details

#build_pdf_object(document) ⇒ Object

Build a PDF object representing this image in document, and return a Reference to it.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/prawn/images/jpg.rb', line 49

def build_pdf_object(document)
  color_space = case channels
  when 1
    :DeviceGray
  when 3
    :DeviceRGB
  when 4
    :DeviceCMYK
  else
    raise ArgumentError, 'JPG uses an unsupported number of channels'
  end

  obj = document.ref!(
    :Type             => :XObject,
    :Subtype          => :Image,
    :Filter           => :DCTDecode,
    :ColorSpace       => color_space,
    :BitsPerComponent => bits,
    :Width            => width,
    :Height           => height,
    :Length           => @data.size
  ) 

  # add extra decode params for CMYK images. By swapping the
  # min and max values from the default, we invert the colours. See
  # section 4.8.4 of the spec.
  if color_space == :DeviceCMYK
    obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ]
  end

  obj << @data
  obj
end