编辑:用魔术克解决了-非常感谢:) GitHub repo中的更新版本,以供对驯鹿故事感兴趣的任何人使用。
我对R很陌生,只是认识了 R闪亮。但是,我正在尝试制作驯鹿发电机。基本原理:组合不同的图像层以创建您的个人驯鹿。例如。使用按钮切换外套颜色,同时轮廓线仍停留在顶部。理想情况下,它最终应该看起来像这样(我用GIMP绘制的预览):
preview of the reindeer generator
我设法将图像转换为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存储库中找到所有文件夹,图像层和其他信息。另外,即使您不能解决我的问题:也可以随意使用图像并传递圣诞节精神。驯鹿的内容应始终免费。 Link to GitHub repo
答案 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)