OCIO's Digitization Program Office completed a Mass Digitization project of the Living Orchid Collection of Smithsonian Gardens. As part of a new effort to showcase our projects, we used EDANr to search for the images taken during this project. When a plant had flowers, a close-up photograph of the flower was taken. These close-ups were downloaded using EDANr to display in 4k resolution displays at the DPO office. This vignette summarizes the process:
Article in Smithsonian Insider about the digitization project.
Add the AppID and AppKey, load packages, other preliminary steps:
#EDAN creds AppID = "APP_ID" AppKey = "verylong_key" #Required packages library("EDANr") library("magick") library("stringr") #Create folders to store images #Horizontal images dir.create("images_h", showWarnings = FALSE) #Vertical images dir.create("images_v", showWarnings = FALSE)
Run the query, first to get the total number of results EDAN has:
#EDAN query for orchids of Smithsonian Gardens with images orchids_query <- "orchid smithsonian gardens&fq=online_media_type:\"Images\"" orchids_fqs <- "online_media_type:\"Images\"" #Get number of results in EDAN results <- EDANr::edan_metadata_search(query = orchids_query, fqs = orchids_fqs, AppID = AppID, AppKey = AppKey, rows = 1, start = 0) results_count <- results$rowCount #Calculate the number of steps needed to get all the results, # in steps of 100 rows each, the maximum the API returns steps <- floor(results_count/100)
Then, loop over the results in steps of 100 results.
#Loop over each step, getting all the images for (i in seq(0, steps)){ #Query to get the next 100 results results <- EDANr::edan_metadata_search(query = orchids_query, fqs = orchids_fqs, AppID = AppID, AppKey = AppKey, rows = 100, start = (i*100)) #If there are results in this step if (!is.null(dim(results$rows))){ #Loop over each result in this step for (j in seq(1, dim(results$rows)[1])){ # #See code below # } } }
Get the images of the j-th row:
#Get images, available from IDS ids_images <- results$rows$content$descriptiveNonRepeating$online_media$media[j][[1]] #Filter for images that were taken by the contractor of the project which_image <- ids_images[stringr::str_which(ids_images$caption, "Creekside Digital"),] #Select the close-up image of the flowers of the plant, coded with '102' in the filename which_image_detail <- which_image[stringr::str_which(ids_images$idsId, "102"),]
Get the URL of the images and download:
#Get image URL image <- which_image_detail$content[1] #Get image ID idsID <- which_image_detail$idsId[1] #Download the image localimage <- paste0(idsID, ".jpg") dlfile <- try(download.file(url = image, destfile = localimage, mode = "wb"), silent = TRUE) #If there is an error, skip and # go to the next one in the loop if (class(dlfile) == "try-error"){ next }
Resize the image for 4k display, checking if horizontal or vertical first:
#Read image to find size img <- image_read(localimage) img_info <- image_info(img) if (img_info$width > img_info$height){ #Horizontal, resize to 3840x2160 img_scaled <- image_scale(img, "3840x2160") }else{ #Vertical, resize to 2160x3840 img_scaled <- image_scale(img, "2160x3840") }
Get specimen info to write on the image:
#Get image title, which contains the name of the specimen img_title <- results$rows$title[j] #If title is too long, break into two lines if (nchar(img_title) > 30){ img_title1 <- strsplit(img_title, " ")[[1]] spl_no <- floor(length(img_title1)/2) img_title_1 <- paste(img_title1[1:spl_no], collapse = " ") img_title_2 <- paste(img_title1[spl_no+1:(length(img_title1) - spl_no)], collapse = " ") img_title <- paste0(img_title_1, "\n ", img_title_2) } #Get common name of plant, if available common_name <- unlist(results$rows$content$indexedStructured$common_name[j])[[1]] if (!is.null(common_name)){ title <- paste0(common_name, "\n", img_title) } #Add the accession number and identify the unit title <- paste0(title, "\nAccession Number: ", results$rows$content$freetext$identifier[j][[1]]$content, "\nSmithsonian Gardens") #Write the info to the image img_ready <- image_annotate(img_scaled, title, font = 'Arial', size = 60, color = "white", gravity = "SouthWest") #Write image to one of two folders if (img_info$width > img_info$height){ #Image is wide, store in Horizontal folder image_write(img_ready, path = paste0("images_h/" , idsID, ".jpg"), format = "jpg") }else{ #Image is tall, store in Vertical folder image_write(img_ready, path = paste0("images_v/", idsID, ".jpg"), format = "jpg") } #Delete original image file.remove(localimage)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.