如何在按下按钮时截取闪亮应用的屏幕截图?

时间:2017-07-31 12:45:43

标签: r shiny

我已经包含了一个最小的例子。有一个download按钮,点击后应下载闪亮的应用程序截图作为PDF格式。代码如下。

library(shiny)
server <- function(input, output) {
  output$distPlot <- renderPlot({
    hist(rnorm(input$obs), col = 'darkgray', border = 'white')
  })

}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
      actionButton("btn", "Download")

    ),
    mainPanel(plotOutput("distPlot"))
  )
)

shinyApp(ui = ui, server = server)

提前致谢!

2 个答案:

答案 0 :(得分:0)

如评论中所述,我尝试使用RSelenium软件包在Shiny-App内部进行屏幕截图。但是显然存在与webshots相同的问题。会话被阻止,因此phantomjs无法访问该网站。

我找到了一个适用于Windows的解决方案,但它需要this批处理文件,并且需要整个屏幕的屏幕截图,而不仅仅是闪亮的应用程序。对于Linux,还有许多其他工具可让您按命令行获取屏幕截图,例如ImageMagickscrot

将.bat文件放在与闪亮应用程序相同的目录中,加载该应用程序,单击下载,允许Windows /防病毒程序运行,并会截取窗口的屏幕截图。

您还可以保存几张图片,尽管我想出一种比我更复杂的命名方法。 ;)

library(shiny)
library(RSelenium)

ui <- {fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
      actionButton("btn", "Download")
    ),
    mainPanel(plotOutput("distPlot"))
  )
)}

server <- function(input, output, session) {
  output$distPlot <- renderPlot({
    hist(rnorm(input$obs), col = 'darkgray', border = 'white')
  })

  observeEvent(input$btn, {
    img = paste0("screen", runif(1,0,1000), ".png")
    str = paste('call screenCapture ', img)
    shell(str)
  })
}

shinyApp(ui = ui, server = server)

要删除浏览器和Windows工具栏,我对.bat文件进行了一些操作。

第66行:

int height = windowRect.bottom - windowRect.top - 37;

第75行:

GDI32.BitBlt(hdcDest, 0, -80, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);

这可以在我的机器上工作,但是您必须调整这些值,甚至想出一个更好的解决方案,因为我不得不承认我不太擅长批处理脚本。这将隐藏工具栏,但底部会出现黑条。


这是RSelenium的实验,没有用

library(shiny)
library(RSelenium)

ui <- {fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100),
      actionButton("btn", "Download")

    ),
    mainPanel(plotOutput("distPlot"))
  )
)}

server <- function(input, output, session) {
  output$distPlot <- renderPlot({
    hist(rnorm(input$obs), col = 'darkgray', border = 'white')
  })

  observeEvent(input$btn, {
    cdat <- session$clientData
    url <- paste0(cdat$url_protocol,"//",cdat$url_hostname,":", cdat$url_port, cdat$url_pathname,cdat$url_search)
    rD <- rsDriver(browser = "firefox", chromever=NULL)
    remDr <- rD$client
    remDr$navigate(url)
    remDr$screenshot(file = tf <- tempfile(fileext = ".png"))
    shell.exec(tf) # on windows
    remDr$close()
    rD$server$stop()
  })
}

shinyApp(ui = ui, server = server)

答案 1 :(得分:0)

对于2020年10月之后来到这里的人:

您可以使用新的shinyscreenshot软件包,就像调用shinyscreenshot::screenshot()一样简单,它将自动下载PNG文件。

示例:

library(shiny)
library(shinyscreenshot)

ui <- fluidPage(
  textInput("text", "Enter some text", "test"),
  actionButton("go", "Take a screenshot")
)

server <- function(input, output) {
  observeEvent(input$go, {
    screenshot()
  })
}

shinyApp(ui, server)