Class: ChunkyPNG::Palette
- Inherits:
-
SortedSet
- Object
- SortedSet
- ChunkyPNG::Palette
- Defined in:
- lib/chunky_png/palette.rb
Overview
A palette describes the set of colors that is being used for an image.
A PNG image can contain an explicit palette which defines the colors of that image, but can also use an implicit palette, e.g. all truecolor colors or all grayscale colors.
This palette supports decoding colors from a palette if an explicit palette is provided in a PNG datastream, and it supports encoding colors to an explicit palette (stores as PLTE & tRNS chunks in a PNG file).
Class Method Summary (collapse)
-
+ (ChunkyPNG::Palette) from_canvas(canvas)
Builds a palette instance from a given canvas.
-
+ (ChunkyPNG::Palette) from_chunks(palette_chunk, transparency_chunk = nil)
Builds a palette instance from a PLTE chunk and optionally a tRNS chunk from a PNG datastream.
-
+ (ChunkyPNG::Palette) from_pixels(pixels)
Builds a palette instance from a given set of pixels.
Instance Method Summary (collapse)
-
- (ChunkyPNG::Color) [](index)
Returns a color, given the position in the original palette chunk.
-
- (Integer) best_color_settings
Determines the most suitable colormode for this palette.
-
- (true, false) black_and_white?
Check whether this palette only contains bacl and white.
-
- (true, false) can_decode?
Checks whether this palette is suitable for decoding an image from a datastream.
-
- (true, false) can_encode?
Checks whether this palette is suitable for encoding an image from to datastream.
-
- (Integer) determine_bit_depth
Determines the minimal bit depth required for an indexed image.
-
- (true, false) grayscale?
Check whether this palette only contains grayscale colors.
-
- (Integer) index(color)
Returns the position of a color in the palette.
-
- (true, false) indexable?
Checks whether the size of this palette is suitable for indexed storage.
-
- (Palette) initialize(enum, decoding_map = nil)
constructor
Builds a new palette given a set (Enumerable instance) of colors.
-
- (true, false) opaque?
Check whether this palette only contains opaque colors.
-
- (ChunkyPNG::Palette) opaque_palette
Returns a palette with all the opaque variants of the colors in this palette.
-
- (ChunkyPNG::Chunk::Palette) to_plte_chunk
Creates a PLTE chunk that corresponds with this palette to store the r, g and b channels of all colors.
-
- (ChunkyPNG::Chunk::Transparency) to_trns_chunk
Creates a tRNS chunk that corresponds with this palette to store the alpha channel of all colors.
Constructor Details
- (Palette) initialize(enum, decoding_map = nil)
Builds a new palette given a set (Enumerable instance) of colors.
22 23 24 25 |
# File 'lib/chunky_png/palette.rb', line 22 def initialize(enum, decoding_map = nil) super(enum) @decoding_map = decoding_map if decoding_map end |
Class Method Details
+ (ChunkyPNG::Palette) from_canvas(canvas)
Builds a palette instance from a given canvas.
62 63 64 |
# File 'lib/chunky_png/palette.rb', line 62 def self.from_canvas(canvas) self.new(canvas.pixels) end |
+ (ChunkyPNG::Palette) from_chunks(palette_chunk, transparency_chunk = nil)
Builds a palette instance from a PLTE chunk and optionally a tRNS chunk from a PNG datastream.
This method will cerate a palette that is suitable for decoding an image.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/chunky_png/palette.rb', line 36 def self.from_chunks(palette_chunk, transparency_chunk = nil) return nil if palette_chunk.nil? decoding_map = [] index = 0 palatte_bytes = palette_chunk.content.unpack('C*') if transparency_chunk alpha_channel = transparency_chunk.content.unpack('C*') else alpha_channel = [] end index = 0 palatte_bytes.each_slice(3) do |bytes| bytes << alpha_channel.fetch(index, ChunkyPNG::Color::MAX) decoding_map << ChunkyPNG::Color.rgba(*bytes) index += 1 end self.new(decoding_map, decoding_map) end |
+ (ChunkyPNG::Palette) from_pixels(pixels)
Builds a palette instance from a given set of pixels.
69 70 71 |
# File 'lib/chunky_png/palette.rb', line 69 def self.from_pixels(pixels) self.new(pixels) end |
Instance Method Details
- (ChunkyPNG::Color) [](index)
Returns a color, given the position in the original palette chunk.
131 132 133 |
# File 'lib/chunky_png/palette.rb', line 131 def [](index) @decoding_map[index] end |
- (Integer) best_color_settings
Determines the most suitable colormode for this palette.
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/chunky_png/palette.rb', line 178 def best_color_settings if black_and_white? [ChunkyPNG::COLOR_GRAYSCALE, 1] elsif grayscale? if opaque? [ChunkyPNG::COLOR_GRAYSCALE, 8] else [ChunkyPNG::COLOR_GRAYSCALE_ALPHA, 8] end elsif indexable? [ChunkyPNG::COLOR_INDEXED, determine_bit_depth] elsif opaque? [ChunkyPNG::COLOR_TRUECOLOR, 8] else [ChunkyPNG::COLOR_TRUECOLOR_ALPHA, 8] end end |
- (true, false) black_and_white?
Check whether this palette only contains bacl and white.
96 97 98 |
# File 'lib/chunky_png/palette.rb', line 96 def black_and_white? entries == [ChunkyPNG::Color::BLACK, ChunkyPNG::Color::WHITE] end |
- (true, false) can_decode?
Checks whether this palette is suitable for decoding an image from a datastream.
This requires that the positions of the colors in the original palette chunk is known, which is stored as an array in the @decoding_map instance variable.
113 114 115 |
# File 'lib/chunky_png/palette.rb', line 113 def can_decode? !@decoding_map.nil? end |
- (true, false) can_encode?
Checks whether this palette is suitable for encoding an image from to datastream.
This requires that the position of the color in the future palette chunk is known, which is stored as a hash in the @encoding_map instance variable.
123 124 125 |
# File 'lib/chunky_png/palette.rb', line 123 def can_encode? !@encoding_map.nil? end |
- (Integer) determine_bit_depth
Determines the minimal bit depth required for an indexed image
199 200 201 202 203 204 205 206 207 |
# File 'lib/chunky_png/palette.rb', line 199 def determine_bit_depth case size when 1..2; 1 when 3..4; 2 when 5..16; 4 when 17..256; 8 else nil end end |
- (true, false) grayscale?
Check whether this palette only contains grayscale colors.
89 90 91 |
# File 'lib/chunky_png/palette.rb', line 89 def grayscale? all? { |color| Color.grayscale?(color) } end |
- (Integer) index(color)
Returns the position of a color in the palette
139 140 141 |
# File 'lib/chunky_png/palette.rb', line 139 def index(color) color.nil? ? 0 : @encoding_map[color] end |
- (true, false) indexable?
Checks whether the size of this palette is suitable for indexed storage.
75 76 77 |
# File 'lib/chunky_png/palette.rb', line 75 def indexable? size <= 256 end |
- (true, false) opaque?
Check whether this palette only contains opaque colors.
82 83 84 |
# File 'lib/chunky_png/palette.rb', line 82 def opaque? all? { |color| Color.opaque?(color) } end |
- (ChunkyPNG::Palette) opaque_palette
Returns a palette with all the opaque variants of the colors in this palette.
103 104 105 |
# File 'lib/chunky_png/palette.rb', line 103 def opaque_palette self.class.new(map { |c| ChunkyPNG::Color.opaque!(c) }) end |
- (ChunkyPNG::Chunk::Palette) to_plte_chunk
Creates a PLTE chunk that corresponds with this palette to store the r, g and b channels of all colors.
Note that a PLTE chunk should only be included if the image is encoded using index colors. After this chunk has been built, the palette becomes suitable for encoding an image.
163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/chunky_png/palette.rb', line 163 def to_plte_chunk @encoding_map = {} colors = [] each_with_index do |color, index| @encoding_map[color] = index colors += ChunkyPNG::Color.to_truecolor_bytes(color) end ChunkyPNG::Chunk::Palette.new('PLTE', colors.pack('C*')) end |
- (ChunkyPNG::Chunk::Transparency) to_trns_chunk
Creates a tRNS chunk that corresponds with this palette to store the alpha channel of all colors.
Note that this chunk can be left out of every color in the palette is opaque, and the image is encoded using indexed colors.
150 151 152 |
# File 'lib/chunky_png/palette.rb', line 150 def to_trns_chunk ChunkyPNG::Chunk::Transparency.new('tRNS', map { |c| ChunkyPNG::Color.a(c) }.pack('C*')) end |