Как получить цвет пикселя в позиции мыши? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть приложение Shiny в R, и я пытаюсь обновить его на основе цвета, выбранного в приложении щелчком мыши / наведением курсора.

У меня есть образец цветов, и если они нажимают на один из цветов, я хочу, чтобы приложение обновлялось на основе этого ввода. С этой целью я пытаюсь получить информацию о цвете пикселя от этого ввода мыши.

Чтобы было ясно, я не хочу виджет выбора цвета, где люди вручную выбирают другой способ.

Любое руководство приветствуется!

1 Ответ

0 голосов
/ 11 апреля 2020

Вот способ:

library(shiny)
library(ggplot2)

js <- '
$(document).ready(function(){
  var canvas = document.createElement("canvas");
  var getPixelColor = setInterval(function(){
    var $img = $("#ggplot>img");
    if($img.length){
      clearInterval(getPixelColor);
      var img = $img[0];
      canvas.width = img.width;
      canvas.height = img.height;
      canvas.getContext("2d").drawImage(img, 0, 0, img.width, img.height);
      $img.on("click", function(e){
        var pixelData = canvas.getContext("2d").
          getImageData(e.offsetX, e.offsetY, 1, 1).data;
        Shiny.setInputValue("color", Array.prototype.slice.call(pixelData));
      })
    }
  }, 100);
})
'

ui <- fluidPage(
  tags$head(
    tags$script(HTML(js))
  ),
  br(),
  fluidRow(
    column(
      width = 9,
      plotOutput("ggplot")
    ),
    column(
      width = 3,
      h3("pixel RGBA:"),
      verbatimTextOutput("pixelRGBA"),
      br(),
      h3("pixel color:"),
      verbatimTextOutput("pixelColor")
    )
  )
)

server <- function(input, output, session){

  output[["ggplot"]] <- renderPlot({
    ggplot(iris) + 
      geom_point(aes(x = Sepal.Length, y = Sepal.Width, colour = Species), 
                 size = 3)
  })

  output[["pixelRGBA"]] <- renderPrint({
    input[["color"]]
  })

  pixelColor <- reactive({
    req(input[["color"]])
    rgba <- input[["color"]]
    rgb(rgba[1], rgba[2], rgba[3], rgba[4], maxColorValue = 255)
  })

  output[["pixelColor"]] <- renderPrint({
    pixelColor()
  })

}

shinyApp(ui, server)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...