Write a bitmap image in PNG format
writePNG.RdCreate a PNG image from an array or matrix.
Usage
writePNG(image, target = raw(), dpi = NULL, asp = NULL,
text = NULL, metadata = NULL)Arguments
- image
image represented by a real matrix or array with values in the range of 0 to 1. Values outside this range will be clipped. The object must be either two-dimensional (grayscale matrix) or three dimensional array (third dimension specifying the plane) and must have either one (grayscale), two (grayscale + alpha), three (RGB) or four (RGB + alpha) planes. (For alternative image specifications see details)
- target
Either name of the file to write, a binary connection or a raw vector (
raw()- the default - is good enough) indicating that the output should be a raw vector.- dpi
optional, if set, must be a numeric vector of length 1 or 2 specifying the resolution of the image in DPI (dots per inch) for x and y (in that order) - it is recycled to length 2.
- asp
optional, if set, must be a numeric scalar specifying the aspect ratio (
x / y).dpiandaspare mutually exclusive, speciyfing both is an error.- text
optional, named character vector of entries that will be saved in the text chunk of the PNG. Names are used as keys. Note that the
"R.metadata"key is reserved for internal use - see below- metadata
optional, an R object that will be serialized into the
"R.metadata"text key
Value
Either NULL if the target is a file or a raw vector containing
the compressed PNG image if the target was a raw vector.
Details
writePNG takes an image as input and compresses it into PNG
format. The image input is usually a matrix (for grayscale images -
dimensions are width, height) or an array (for color and alpha
images - dimensions are width, height, planes) of reals. The planes
are interpreted in the sequence red, green, blue, alpha.
Alternative representation of an image is of nativeRaster class
which is an integer matrix with each entry representing one pixel in
binary encoded RGBA format (as used internally by R). It can be
obtained from readPNG using native = TRUE.
Finally, writePNG also supports raw array containing the RGBA
image as bytes. The dimensions of the raw array have to be planes,
width, height (because the storage is interleaved). Currently only 4
planes (RGBA) are supported and the processing is equivalent to that
of a native raster.
The result is either stored in a file (if target is a file
name), in a raw vector (if target is a raw vector) or sent to a
binary connection.
If either dpi or asp is set, the sPHy chunk is
generated based on that information. Note that not all image viewers
interpret this setting, and even fewer support non-square pixels.
Note
Currently writePNG only produces 8-bit, deflate-compressed,
non-quantized, non-interlaced images. Note in particular that
readPNG can read 16-bit channels but storing them
back using writePNG will strip the 8 LSB (irrelevant for
display purposes but possibly relevant for use of PNG in
signal-processing if the input is truly 16-bit wide).
Examples
# read a sample file (R logo)
img <- readPNG(system.file("img","Rlogo.png",package="png"))
# write the image into a raw vector
r <- writePNG(img)
# read it back again
img2 <- readPNG(r)
# it better be the same
identical(img, img2)
#> [1] TRUE
# try to write a native raster
img3 <- readPNG(system.file("img","Rlogo.png",package="png"), TRUE)
r2 <- writePNG(img3)
img4 <- readPNG(r2, TRUE)
identical(img3, img4)
#> [1] TRUE
## text and metadata
r <- writePNG(img, text=c(source=R.version.string),
metadata=sessionInfo())
img5 <- readPNG(r, info=TRUE)
attr(img5, "info")
#> $dim
#> [1] 100 76
#>
#> $bit.depth
#> [1] 8
#>
#> $color.type
#> [1] "RGBA"
#>
#> $text
#> source
#> "R version 4.5.1 (2025-06-13)"
#>
attr(img5, "metadata")
#> R version 4.5.1 (2025-06-13)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
#> [4] LC_COLLATE=C LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
#> [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
#> [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] png_0.1-9
#>
#> loaded via a namespace (and not attached):
#> [1] vctrs_0.7.1 cli_3.6.5 knitr_1.51 rlang_1.1.7
#> [5] xfun_0.56 purrr_1.2.1 textshaping_1.0.5 jsonlite_2.0.0
#> [9] glue_1.8.0 htmltools_0.5.9 ragg_1.5.1 sass_0.4.10
#> [13] fansi_1.0.7 rappdirs_0.3.4 rmarkdown_2.30 evaluate_1.0.5
#> [17] jquerylib_0.1.4 tibble_3.3.1 fontawesome_0.5.3 fastmap_1.2.0
#> [21] yaml_2.3.12 lifecycle_1.0.5 httr2_1.2.2 memoise_2.0.1
#> [25] whisker_0.4.1 compiler_4.5.1 fs_1.6.7 downlit_0.4.5
#> [29] pkgconfig_2.0.3 systemfonts_1.3.2 digest_0.6.39 R6_2.6.1
#> [33] curl_7.0.0 pillar_1.11.1 magrittr_2.0.4 bslib_0.10.0
#> [37] tools_4.5.1 withr_3.0.2 pkgdown_2.2.0 xml2_1.5.2
#> [41] cachem_1.1.0 desc_1.4.3