Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从包含chrome扩展生成的屏幕截图的画布中获取像素数据?_Javascript_Html_Canvas_Google Chrome Extension_Html5 Canvas - Fatal编程技术网

Javascript 如何从包含chrome扩展生成的屏幕截图的画布中获取像素数据?

Javascript 如何从包含chrome扩展生成的屏幕截图的画布中获取像素数据?,javascript,html,canvas,google-chrome-extension,html5-canvas,Javascript,Html,Canvas,Google Chrome Extension,Html5 Canvas,我正在尝试实现一个非常简单的颜色选择器chrome扩展。这个想法很简单 利用chrome提供的captureVisibleTab API定期获取当前页面的屏幕截图 将此屏幕截图加载到画布中,然后对画布上下文使用get getImageData方法,并基于鼠标坐标显示像素的颜色值 我认为这个想法实施起来相当简单,但结果却不是那么好。有关以下代码段的任何帮助都会很有帮助: background.js(工作正常!) content_script.js function fill_canvas(){

我正在尝试实现一个非常简单的颜色选择器chrome扩展。这个想法很简单

  • 利用chrome提供的captureVisibleTab API定期获取当前页面的屏幕截图
  • 将此屏幕截图加载到画布中,然后对画布上下文使用get getImageData方法,并基于鼠标坐标显示像素的颜色值
  • 我认为这个想法实施起来相当简单,但结果却不是那么好。有关以下代码段的任何帮助都会很有帮助:

    background.js(工作正常!)

    content_script.js

    function fill_canvas(){
        chrome.extension.sendMessage({action: 'capture'}, function(response) {
            canvas = document.createElement('canvas');
            canvas.width= $(window).width();
            canvas.width= $(window).height();
            canvasContext = canvas.getContext('2d');
            var img = new Image();
            img.onLoad = function(){
                canvasContext.drawImage(img, 0, 0);
            }  
            img.src = response.imageUrl;
        });
    }
    $(document).ready(function(){
        fill_canvas();
        $(document).mousemove(function(e) {
            pixelData   = canvasContext.getImageData(e.offsetX,e.offsetY, 1, 1).data;
            console.log(pixelData);
        });
    });
    
    请期待周围的代码正常工作(如简单的激活扩展按钮)以及清单中授予的所有相关权限。

    为pixelData生成的输出如下所示:

    [0, 0, 0, 0, byteLength: 4, byteOffset: 0, buffer: ArrayBuffer, subarray: function, set: function…]
    
    除了我需要的那一条外,它在开头包含了很多信息


    干杯

    由于javascript区分大小写,因此您的
    onLoad
    将永远不会生效(事件没有驼峰大小写)。尽量降低它的大小写:

    // onload not onLoad
    img.onload = function(){
        canvasContext.drawImage(img, 0, 0);
    }
    
    我还注意到您将画布和上下文放在全局范围(窗口)上。我猜(我不熟悉Chrome的扩展api),api阻止或隔离窗口对象(密封或冻结它)

    修改这些,我很确定,wo/测试,它会起作用:

    //use 'var' in front
    var canvas = document.createElement('canvas');
    var canvasContext = canvas.getContext('2d');
    

    或者在此函数之外定义它们(您不显示是否已经这样做了)。

    您表示我们应该期望周围的代码正常工作,但我仍然需要询问您是否仔细检查了该响应。imageUrl是否确实包含任何数据?(如果您使用console.log(response.imageUrl)它包含什么)。hi@Ken AbdiasSoftware它包含dataurl,它在浏览器中作为图像打开。这是选项卡中当前可见区域的屏幕截图。请参考此粘贴并尝试在浏览器中打开数据url。即使我这么认为。但这会产生一个未捕获的TypeError:Type error content_script.js:img.onload谢谢@Ken,工作正常。在某种程度上,但可以给我确切的颜色细节,脱口而出的随机颜色通常是白色。请帮帮我@whizzkid如果你觉得答案是正确的,你可以在柜台左上方的下方将其标记为正确。请帮我解决这个问题
    //use 'var' in front
    var canvas = document.createElement('canvas');
    var canvasContext = canvas.getContext('2d');