我想在我闪亮的应用程序中添加简单的裁剪功能,可以裁剪上传的图像并将其保存到文件系统中。
上传图像和使用croppie.js 渲染的第一部分有效,但我无法在按钮单击工作时获得裁剪并将裁剪图像保存到 www/ 文件夹的第二部分。
第一个问题是在第二个 JS 代码块中不能再引用 JS 变量 basic。即使,我也不知道如何使用变量croppedImage 将图像作为jpeg 文件保存到www 文件夹。
编辑:
好的,我找到了一种将 base64 编码图像从 Javascript 传递给 R 的方法Shiny.onInputChange
。现在我需要解码图像并使用 R 保存。但这不起作用,图像文件已保存,但无法打开。
library(shiny)
library(shinyjs)
library(stringr)
library(base64enc)
ui <- fluidPage(
shinyjs::useShinyjs(),
tags$head(HTML('<link href="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.4.0/croppie.css" rel="stylesheet">')),
tags$script(src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"),
tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/croppie/2.4.0/croppie.js"),
fileInput("image_upload",
label = "Image", width = "300px",
accept = c("image/png", "image/jpeg", "image/jpg")),
div(id = "demo-basic", style = "
width: 900px;
height: 600px;"),
br(),
br(),
actionButton("crop", "Crop image")
)
server <- function(input, output, session) {
observeEvent(input$image_upload, {
file.rename(input$image_upload$datapath, str_c("www/image0.jpg"))
runjs(paste0("
$(function () {
var basic = $('#demo-basic').croppie({
viewport: {
width: 900,
height: 600
}
});
basic.croppie('bind', {
url: 'image0.jpg'
});
});
"))
})
observeEvent(input$crop, {
runjs("
var basic = $('#demo-basic').croppie({
viewport: {
width: 900,
height: 600
}
});
basic.croppie('result', {
format: 'jpeg'
}).then(function(croppedImage) {
Shiny.onInputChange('cropped', croppedImage);
});
")
})
observeEvent(input$cropped, {
# This does not work yet
enc <- input$cropped
outconn <- file("cropped.jpeg","wb")
base64decode(what = enc, output = outconn)
close(outconn)
})
}
shinyApp(ui, server)