Наложение изображений в R Shiny

Обновлено: решено с помощью магии - большое спасибо, ребята :) Обновленная версия в Репозиторий GitHub для всех, кто интересуется историей об оленях.

Я новичок в R и только что познакомился с R блестящий. Еще пытаюсь сделать генератор оленей. Основной принцип: комбинируйте разные слои изображений, чтобы создать своего личного оленя. Например. меняйте цвета пальто с помощью пуговиц, пока контуры остаются на своих местах. В идеале это должно выглядеть примерно так (предварительный просмотр, который я набросал с помощью GIMP):

превью генератора оленей

Мне удается загрузить изображения в Shiny и для начала переключаться между двумя слоями с помощью переключателей. Однако я понятия не имею, как отображать изображения одновременно в одном и том же месте, чтобы контуры были дополнительным слоем поверх пальто.

Вы можете увидеть проблему здесь:

выбрано серое пальто

выбрано коричневое пальто

Вот мой код. Поскольку имя файла частично генерируется переключением радиокнопки, я оставил такие пути.

library(shiny)

ui <- fluidPage(

  titlePanel("R-eindeer"),

  sidebarLayout(
    sidebarPanel(
      radioButtons("check1","coat colour", choices = c("grey","brown"))
      ),

    mainPanel(
      imageOutput("reindeer_coat"),
      imageOutput("reindeer_outline")
      )
    )
  )


server <- function(input,output){

  getImage <- reactive({
    list(src = paste0("./coat/reindeer_", input$check1, ".png"),
         width = 500,
         height = 500)
  })

  output$reindeer_coat <- renderImage({
    getImage()
  }, deleteFile = FALSE)

  output$reindeer_outline <- renderImage({
    return(list(src = "./outlines/reindeer_outline.png",
                width = 500,
                height = 500,
                contentType = 'image/png'))
  }, deleteFile = FALSE)
}

shinyApp(ui = ui, server = server)

Буду признателен за любую помощь. Даже если эта проблема решена, мне еще предстоит пройти долгий путь, но, возможно, я смогу научиться достаточно быстро, чтобы успеть до Рождества ;-)

PS: Вы можете найти все папки, слои изображений и дополнительную информацию в только что созданном мной Репозиторий Git. Кроме того, даже если вы не можете решить мой вопрос: не стесняйтесь использовать изображения и передать дух Рождества. Содержание оленей всегда должно быть бесплатным. Ссылка на репозиторий GitHub

ознакомьтесь с пакетом magick, это один из основных пакетов для работы с изображениями. cran.r-project.org/web/packages/magick/vignettes/intro.html

Ian Wesley 04.12.2018 00:14

PS Ваш проект выглядит забавно! Сообщите мне, если раздел слоев в этой ссылке не дает вам того, что вам нужно, и я буду рад помочь.

Ian Wesley 04.12.2018 00:23

Спасибо тебе :) Магия сделала свое дело.

einGlasRotwein 04.12.2018 10:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
995
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминалось в комментариях, magick может сделать это за вас! В частности, image_mosaic будет накладывать изображения.

Попробуйте это:

library(shiny)
library(magick)

ui <- fluidPage(

    titlePanel("R-eindeer"),

    sidebarLayout(
        sidebarPanel(
            radioButtons("check1","coat colour", choices = c("grey","brown"))
        ),

        mainPanel(
            imageOutput("reindeer")
        )
    )
)


server <- function(input,output){

    get_image <- function(type, color) {
        image_read(file.path(type, paste0(color, ".png")))
    }

    output$reindeer <- renderImage({

        # load the images
        coat <- get_image("coat", paste0("reindeer_", input$check1))
        outline <- get_image("outlines", "reindeer_outline")

        # make the reindeer: overlay in order
        reindeer <- c(coat, outline)

        # create a temp file
        tmpfile <- reindeer %>%
            image_mosaic() %>%
            image_flatten() %>%
            image_write(tempfile(fileext='jpg'), format = 'jpg')

        # render the file
        return(list(src = tmpfile,
                    height = 300,
                    width = 300,
                    alt = "Your reindeer",
                    contentType = "image/jpg"))
    }, deleteFile = TRUE)
}

shinyApp(ui = ui, server = server)

О боже, это действительно - волшебно! Это сработало, и мне очень приятно видеть эту работу. Большое спасибо!

einGlasRotwein 04.12.2018 10:24

@einGlasRotwein Я рад, что это помогло! Удачи в вашем проекте - я с нетерпением жду возможности построить своего собственного оленя!

Hallie Swan 04.12.2018 19:00

Другие вопросы по теме