Module: ChunkyPNG::Canvas::StreamImporting

Included in:
ChunkyPNG::Canvas
Defined in:
lib/chunky_png/canvas/stream_importing.rb

Overview

Methods to quickly load a canvas from a stream, encoded in RGB, RGBA, BGR or ABGR format.

Instance Method Summary collapse

Instance Method Details

#from_abgr_stream(width, height, stream) ⇒ ChunkyPNG::Canvas

Creates a canvas by reading pixels from an ARGB formatted stream with a provided with and height.

Every pixel should be represented by 4 bytes in the stream, in the correct ARGB order. This format is almost like the internal representation of a canvas object, so this kind of stream can be read extremely quickly.

Parameters:

  • width (Integer)

    The width of the new canvas.

  • height (Integer)

    The height of the new canvas.

  • stream (#read, String)

    The stream to read the pixel data from.

Returns:



71
72
73
74
# File 'lib/chunky_png/canvas/stream_importing.rb', line 71

def from_abgr_stream(width, height, stream)
  string = stream.respond_to?(:read) ? stream.read(4 * width * height) : stream.to_s[0, 4 * width * height]
  new(width, height, string.unpack("V*"))
end

#from_bgr_stream(width, height, stream) ⇒ ChunkyPNG::Canvas

Creates a canvas by reading pixels from an BGR formatted stream with a provided with and height.

Every pixel should be represented by 3 bytes in the stream, in the correct BGR order. This format closely resembles the internal representation of a canvas object, so this kind of stream can be read extremely quickly.

Parameters:

  • width (Integer)

    The width of the new canvas.

  • height (Integer)

    The height of the new canvas.

  • stream (#read, String)

    The stream to read the pixel data from.

Returns:



53
54
55
56
57
58
# File 'lib/chunky_png/canvas/stream_importing.rb', line 53

def from_bgr_stream(width, height, stream)
  string = ChunkyPNG::EXTRA_BYTE.dup # Add a first byte to the first BGR triple.
  string << (stream.respond_to?(:read) ? stream.read(3 * width * height) : stream.to_s[0, 3 * width * height])
  pixels = string.unpack("@1#{"XV" * (width * height)}").map { |color| color | 0x000000ff }
  new(width, height, pixels)
end

#from_rgb_stream(width, height, stream) ⇒ ChunkyPNG::Canvas

Creates a canvas by reading pixels from an RGB formatted stream with a provided with and height.

Every pixel should be represented by 3 bytes in the stream, in the correct RGB order. This format closely resembles the internal representation of a canvas object, so this kind of stream can be read extremely quickly.

Parameters:

  • width (Integer)

    The width of the new canvas.

  • height (Integer)

    The height of the new canvas.

  • stream (#read, String)

    The stream to read the pixel data from.

Returns:



18
19
20
21
22
23
24
# File 'lib/chunky_png/canvas/stream_importing.rb', line 18

def from_rgb_stream(width, height, stream)
  string = stream.respond_to?(:read) ? stream.read(3 * width * height) : stream.to_s[0, 3 * width * height]
  string << ChunkyPNG::EXTRA_BYTE # Add a fourth byte to the last RGB triple.
  unpacker = "NX" * (width * height)
  pixels = string.unpack(unpacker).map { |color| color | 0x000000ff }
  new(width, height, pixels)
end

#from_rgba_stream(width, height, stream) ⇒ ChunkyPNG::Canvas

Creates a canvas by reading pixels from an RGBA formatted stream with a provided with and height.

Every pixel should be represented by 4 bytes in the stream, in the correct RGBA order. This format is exactly like the internal representation of a canvas object, so this kind of stream can be read extremely quickly.

Parameters:

  • width (Integer)

    The width of the new canvas.

  • height (Integer)

    The height of the new canvas.

  • stream (#read, String)

    The stream to read the pixel data from.

Returns:



37
38
39
40
# File 'lib/chunky_png/canvas/stream_importing.rb', line 37

def from_rgba_stream(width, height, stream)
  string = stream.respond_to?(:read) ? stream.read(4 * width * height) : stream.to_s[0, 4 * width * height]
  new(width, height, string.unpack("N*"))
end