Reading and Writing Images

2018-10-31

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")
print(path_dancing_banana)
#> [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.

library(ijtiff)
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.

str(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 https://www.awaresystems.be/imaging/tiff/tifftags.html. 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")
print(path)
#> [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 https://ropensci.github.io/ijtiff/articles/text-images.html.