Class: Prawn::Images::JPG
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
Extension API collapse
- JPEG_SOF_BLOCKS =
[ 0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF ].freeze
Extension API collapse
-
#bits ⇒ Object
readonly
Returns the value of attribute bits.
-
#channels ⇒ Object
readonly
Returns the value of attribute channels.
-
#height ⇒ Object
readonly
Returns the value of attribute height.
-
#scaled_height ⇒ Object
Returns the value of attribute scaled_height.
-
#scaled_width ⇒ Object
Returns the value of attribute scaled_width.
-
#width ⇒ Object
readonly
Returns the value of attribute width.
Extension API collapse
- .can_render?(image_blob) ⇒ Boolean
-
#build_pdf_object(document) ⇒ Object
Build a PDF object representing this image in
document
, and return a Reference to it. -
#initialize(data) ⇒ JPG
constructor
Process a new JPG image.
Methods inherited from Image
Constructor Details
#initialize(data) ⇒ JPG
Process a new JPG image
:data
-
A binary string of JPEG data
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/prawn/images/jpg.rb', line 37 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') raise '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
#bits ⇒ Object (readonly)
Returns the value of attribute bits.
21 22 23 |
# File 'lib/prawn/images/jpg.rb', line 21 def bits @bits end |
#channels ⇒ Object (readonly)
Returns the value of attribute channels.
21 22 23 |
# File 'lib/prawn/images/jpg.rb', line 21 def channels @channels end |
#height ⇒ Object (readonly)
Returns the value of attribute height.
21 22 23 |
# File 'lib/prawn/images/jpg.rb', line 21 def height @height end |
#scaled_height ⇒ Object
Returns the value of attribute scaled_height.
22 23 24 |
# File 'lib/prawn/images/jpg.rb', line 22 def scaled_height @scaled_height end |
#scaled_width ⇒ Object
Returns the value of attribute scaled_width.
22 23 24 |
# File 'lib/prawn/images/jpg.rb', line 22 def scaled_width @scaled_width end |
#width ⇒ Object (readonly)
Returns the value of attribute width.
21 22 23 |
# File 'lib/prawn/images/jpg.rb', line 21 def width @width end |
Class Method Details
.can_render?(image_blob) ⇒ Boolean
29 30 31 |
# File 'lib/prawn/images/jpg.rb', line 29 def self.can_render?(image_blob) image_blob[0, 3].unpack('C*') == [255, 216, 255] end |
Instance Method Details
#build_pdf_object(document) ⇒ Object
Build a PDF object representing this image in document
, and return a Reference to it.
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 87 88 89 90 91 92 |
# File 'lib/prawn/images/jpg.rb', line 60 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, 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 |