Я написал блестящее приложение, которое позволяет пользователю рисовать прямоугольники поверх изображения (минимальный воспроизводимый пример ниже).
Проблема с моим текущим подходом заключается в том, что каждый раз, когда прямоугольник добавлено, новое изображение создается, записывается на диск и обрабатывается (отправляется в браузер пользователя). Это занимает довольно много времени и становится действительно раздражающим, когда соединение Inte rnet медленное.
Есть ли способ отобразить прямоугольники поверх изображения прямо в браузере , не изменяя изображение на стороне сервера? Единственное, что мне нужно, это убедиться, что браузер отправляет обратно на сервер координаты прямоугольников на графике.
Хороший пример того, что я ищу (в JavaScript): https://kyamagu.github.io/bbox-annotator/demo.html Я знаю, JavaScript можно встроить в приложение Shiny через виджет, если никто не предложит более простое решение, это то, что я сделаю.
library(shiny)
library(png)
library(RCurl)
myurl = 'https://raw.githubusercontent.com/Tixierae/deep_learning_NLP/master/CNN_IMDB/cnn_illustration.png'
my_img = readPNG(getURLContent(myurl))
img_height = dim(my_img)[1]
img_width = dim(my_img)[2]
server = function(input, output) {
observe({
outfile = tempfile(tmpdir='./', fileext='.png')
png(filename=outfile,width=img_width,height=img_height)
par(mar=c(0,0,0,0),xaxs='i', yaxs='i')
plot(NA,xlim=c(0,img_width),ylim=c(0,img_height))
rasterImage(my_img,0,0,img_width,img_height)
if (!is.null(input$image_brush)){
b_in = lapply(input$image_brush,as.numeric)
if (!is.null(b_in$xmin)){
rect(b_in$xmin,img_height-b_in$ymax,b_in$xmax,img_height-b_in$ymin,border='green',lwd=5)
}
}
dev.off()
output$my_image = renderImage({
list(
src = outfile,
contentType = 'image/png',
width = img_width,
height = img_height,
alt = ''
)
},deleteFile=TRUE)
output$image = renderUI({
imageOutput('my_image',
height = img_height,
width = img_width,
click = 'image_click',
dblclick = dblclickOpts(
id = 'image_dblclick'
),
hover = hoverOpts(
id = 'image_hover'
),
brush = brushOpts(
id = 'image_brush',resetOnNew=TRUE,delayType='debounce',delay=100000
)
)
})
})
}
ui = bootstrapPage(
uiOutput('image')
)
shinyApp(ui=ui, server=server)