Compresses bm_bitmap() objects by a factor of two by re-mapping to a “block elements” scheme.
For pixmap objects like bm_pixmap() we simply shrink the pixmap by a factor of two using bm_distort().
Usage
bm_compress(x, direction = "vertical", ...)
# S3 method for class 'bm_bitmap'
bm_compress(x, direction = "vertical", ...)
# S3 method for class 'bm_pixmap'
bm_compress(x, direction = "vertical", ..., filter = "Point")
# S3 method for class '`magick-image`'
bm_compress(x, direction = "vertical", ..., filter = "Point")
# S3 method for class 'nativeRaster'
bm_compress(x, direction = "vertical", ..., filter = "Point")
# S3 method for class 'raster'
bm_compress(x, direction = "vertical", ..., filter = "Point")
# S3 method for class 'bm_list'
bm_compress(x, ...)Arguments
- x
Either a
bm_bitmap(),bm_font(),bm_list(), "magick-image", "nativeRaster",bm_pixmap(), or "raster" object.- direction
Either "vertical" or "v", "horizontal" or "h", OR "both" or "b".
- ...
Additional arguments to be passed to or from methods.
- filter
Passed to
magick::image_resize(). Usemagick::filter_types()for list of supported filters. The default "Point" filter will maintain your sprite's color palette.NULLwill give you themagick's default filter which may work better if you are not trying to maintain a sprite color palette.
Value
Depending on x either a bm_bitmap(), bm_font(), bm_list(), magick-image, "nativeRaster", bm_pixmap(), or raster object.
Details
Depending on direction we shrink the bitmaps height and/or width by
a factor of two and re-encode pairs/quartets of pixels to a “block elements” scheme.
If necessary we pad the right/bottom of the bitmap(s) by
a pixel. For each pair/quartet we determine the most-common non-zero element
and map them to a length twenty set of integers representing the “block
elements” scheme. For integers greater than zero we map it to higher twenty
character sets i.e. 1's get mapped to 0:19, 2's get mapped to 20:39, 3's
get mapped to 40:59, etc. Using the default px_unicode will give you the exact
matching “Block Elements” glyphs while px_ascii gives the closest ASCII approximation.
Hence print.bm_bitmap() should produce reasonable results for compressed bitmaps if
either of them are used as the px argument.
See also
See https://en.wikipedia.org/wiki/Block_Elements for more info on the Unicode Block Elements block.
Examples
font_file <- system.file("fonts/spleen/spleen-8x16.hex.gz", package = "bittermelon")
font <- read_hex(font_file)
r <- font[[str2ucp("R")]]
print(r)
#> ░░░░░░░░
#> ░░░░░░░░
#> ██████░░
#> ██░░░██░
#> ██░░░██░
#> ██░░░██░
#> ██████░░
#> ██░░░██░
#> ██░░░██░
#> ██░░░██░
#> ██░░░██░
#> ██░░░██░
#> ░░░░░░░░
#> ░░░░░░░░
#> ░░░░░░░░
#> ░░░░░░░░
print(bm_compress(r, "vertical"))
#>
#> ██▀▀▀█▄
#> ██ ██
#> ██▀▀▀█▄
#> ██ ██
#> ██ ██
#>
#>
print(bm_compress(r, "horizontal"))
#>
#>
#> ███
#> █ ▐▌
#> █ ▐▌
#> █ ▐▌
#> ███
#> █ ▐▌
#> █ ▐▌
#> █ ▐▌
#> █ ▐▌
#> █ ▐▌
#>
#>
#>
#>
print(bm_compress(r, "both"))
#>
#> █▀▜▖
#> █ ▐▌
#> █▀▜▖
#> █ ▐▌
#> █ ▐▌
#>
#>
img <- png::readPNG(system.file("img", "Rlogo.png", package="png"))
logo <- as_bm_pixmap(img)
if (cli::is_utf8_output() &&
cli::num_ansi_colors() > 256L &&
requireNamespace("magick", quietly = TRUE)) {
logo_c <- bm_compress(pm, "both", filter = NULL)
print(logo_c, compress = "v")
}