在R Shiny中叠加图像

时间:2018-12-03 20:37:12

标签: r image shiny

编辑:用魔术克解决了-非常感谢:) GitHub repo中的更新版本,以供对驯鹿故事感兴趣的任何人使用。

我对R很陌生,只是认识了 R闪亮。但是,我正在尝试制作驯鹿发电机。基本原理:组合不同的图像层以创建您的个人驯鹿。例如。使用按钮切换外套颜色,同时轮廓线仍停留在顶部。理想情况下,它最终应该看起来像这样(我用GIMP绘制的预览):

preview of the reindeer generator

我设法将图像转换为Shiny,然后通过单选按钮在两层外套之间切换。 但是,我不知道如何在相同的位置同时显示图像,因此轮廓将在外套的顶部增加一层。

您可以在此处看到问题:

grey coat selected

brown coat selected

这是我的代码。由于文件名部分是由单选按钮输入生成的,因此我保留了这样的路径。

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存储库中找到所有文件夹,图像层和其他信息。另外,即使您不能解决我的问题:也可以随意使用图像并传递圣诞节精神。驯鹿的内容应始终免费。 Link to GitHub repo

1 个答案:

答案 0 :(得分: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)