Reading and Writing Images


Reading TIFF files

Check out the following video:

As you can see, it’s a colour video of a banana dancing in front of the R logo. Hence, it has colour channel (red, green and blue) and frame (a video is comprised of several frames) information inside. I have this video saved in a TIFF file.

path_dancing_banana <- system.file("img", "Rlogo-banana.tif",
                                   package = "ijtiff")
#> [1] "/private/var/folders/l_/2mwm03p55zg7zjykv084hhvr0000gn/T/RtmpXGJe9r/Rinst1529221d83014/ijtiff/img/Rlogo-banana.tif"

To read it in, you just need read_tif() and the path to the image.

img_dancing_banana <- read_tif(path_dancing_banana)
#> Reading Rlogo-banana.tif: an 8-bit, 155x200 pixel image of
#> unsigned integer type with 3 channels and 8 frames . . .
#>  Done.

Let’s take a peek inside of img_dancing_banana.

#>  'ijtiff_img' num [1:155, 1:200, 1:3, 1:8] 255 255 255 255 255 255 255 255 255 255 ...
#>  - attr(*, "width")= int 200
#>  - attr(*, "length")= int 155
#>  - attr(*, "bits_per_sample")= int 8
#>  - attr(*, "samples_per_pixel")= int 3
#>  - attr(*, "sample_format")= chr "uint"
#>  - attr(*, "planar_config")= chr "contiguous"
#>  - attr(*, "rows_per_strip")= int 155
#>  - attr(*, "compression")= chr "LZW"
#>  - attr(*, "software")= chr "tiff package, R 3.5.0"
#>  - attr(*, "color_space")= chr "RGB"

You can see it’s a 4-dimensional array. The last two dimensions are 3 and 8; this is because these are the channel and frame slots respectively: the image has 3 channels (red, green and blue) and 8 frames. The first two dimensions tell us that the images in the video are 155 pixels tall and 200 pixels wide. The image object is of class ijtiff_img. This guarantees that it is a 4-dimensional array with this structure. The attributes of the ijtiff_img give information on the various TIFF tags that were part of the TIFF image. You can read more about various TIFF tags at To read just the tags and not the image, use the read_tags() function.

That’s it really as far as reading TIFF files goes; it’s that simple. Let’s visualize the constituent parts of that 8-frame, colour TIFF.

There you go; 8 frames in 3 colours.

More examples

If you read an image with only one frame, the frame slot (4) will still be there:

You can also have an image with only 1 channel:

Writing TIFF files

To write an image, you need an object in the style of an ijtiff_img object. You can read about those here. The basic idea is to have your image in a 4-dimensional array with the structure img[y, x, channel, frame]. Then, to write this image to the location path, you just type write_tif(img, path).

path <- tempfile(pattern = "dancing-banana", fileext = ".tif")
#> [1] "/var/folders/l_/2mwm03p55zg7zjykv084hhvr0000gn/T//RtmpRYmZCJ/dancing-banana1531163e35e9f.tif"
write_tif(img_dancing_banana, path)
#> Writing dancing-banana1531163e35e9f.tif: an 8-bit, 155x200
#> pixel image of unsigned integer type with 3 channels and 8
#> frames . . .
#>  Done.

Reading text images

You may have a text image that you want to read (but realistically, you might never).1

path_txt_img <- system.file("img", "Rlogo-grey.txt", package = "ijtiff")
txt_img <- read_txt_img(path_txt_img)
#> Reading 76x100 pixel text image 'Rlogo-grey.txt' . . .
#>  Done.

Writing text images

Writing a text image works as you’d expect.

write_txt_img(txt_img, path = tempfile(pattern = "txtimg", fileext = ".txt"))
#> Writing txtimg153117e70e5b2.txt: a 76x100 pixel text image with 1 channel and 1 frame . . .
#>  Done.

  1. If you don’t know what text images are, see