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.
If you read an image with only one frame, the frame slot (4) will still be there:
path_rlogo <- system.file("img", "Rlogo.tif", package = "ijtiff")
img_rlogo <- read_tif(path_rlogo)
#> Reading Rlogo.tif: an 8-bit, 76x100 pixel image of unsigned
#> integer type with 4 channels and 1 frame . . .
#> Done.
dim(img_rlogo) # 4 channels, 1 frame
#> [1] 76 100 4 1
class(img_rlogo)
#> [1] "ijtiff_img" "array"
display(img_rlogo)
You can also have an image with only 1 channel:
path_rlogo_grey <- system.file("img", "Rlogo-grey.tif", package = "ijtiff")
img_rlogo_grey <- read_tif(path_rlogo_grey)
#> Reading Rlogo-grey.tif: a 32-bit, 76x100 pixel image of
#> floating point type with 1 channel and 1 frame . . .
#> Done.
dim(img_rlogo_grey) # 1 channel, 1 frame
#> [1] 76 100 1 1
display(img_rlogo_grey)
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.
You may have a text image that you want to read (but realistically, you might never).1
Writing a text image works as you’d expect.
If you don’t know what text images are, see https://ropensci.github.io/ijtiff/articles/text-images.html.↩