Class: Prawn::Images::JPG

Inherits:
Image
  • 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

JPEG_SOF_BLOCKS =
[0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF]

Extension API (collapse)

Extension API (collapse)

Methods inherited from Image

#calc_image_dimensions

Constructor Details

- (JPG) initialize(data)

Process a new JPG image

:data

A binary string of JPEG data



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/prawn/images/jpg.rb', line 32

def initialize(data)
  @data = data
  d = StringIO.new(@data)
  d.binmode

  c_marker = 0xff # Section marker.
  d.seek(2)    # Skip the first two bytes of JPEG identifier.
  loop do
    marker, code, length = d.read(4).unpack('CCn')
    fail "JPEG marker not found!" if marker != c_marker

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

    d.seek(length - 2, IO::SEEK_CUR)
  end
end

Instance Attribute Details

- (Object) bits (readonly)

Returns the value of attribute bits



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

def bits
  @bits
end

- (Object) channels (readonly)

Returns the value of attribute channels



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

def channels
  @channels
end

- (Object) height (readonly)

Returns the value of attribute height



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

def height
  @height
end

- (Object) scaled_height

Returns the value of attribute scaled_height



20
21
22
# File 'lib/prawn/images/jpg.rb', line 20

def scaled_height
  @scaled_height
end

- (Object) scaled_width

Returns the value of attribute scaled_width



20
21
22
# File 'lib/prawn/images/jpg.rb', line 20

def scaled_width
  @scaled_width
end

- (Object) width (readonly)

Returns the value of attribute width



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

def width
  @width
end

Class Method Details

+ (Boolean) can_render?(image_blob)

Returns:

  • (Boolean)


24
25
26
# File 'lib/prawn/images/jpg.rb', line 24

def self.can_render?(image_blob)
  image_blob[0, 3].unpack("C*") == [255, 216, 255]
end

Instance Method Details

- (Object) build_pdf_object(document)

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



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
82
83
84
85
86
# File 'lib/prawn/images/jpg.rb', line 55

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

  obj = document.ref!(
    :Type             => :XObject,
    :Subtype          => :Image,
    :ColorSpace       => color_space,
    :BitsPerComponent => bits,
    :Width            => width,
    :Height           => height
  )

  # 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.stream << @data
  obj.stream.filters << :DCTDecode
  obj
end