Наложение изображений в R Shiny - PullRequest
0 голосов
/ 03 декабря 2018

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

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

предварительный просмотр генератора оленей

Мне удалось получить изображения вБлестите и переключайтесь между двумя пальто с радио-кнопками, для начала.Тем не менее, я понятия не имею, как одновременно отображать изображения в одном и том же месте, поэтому контуры будут дополнительным слоем поверх слоя.

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

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

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

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

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

1 Ответ

0 голосов
/ 04 декабря 2018

Как уже упоминалось в комментариях, 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...