【问题标题】:JS - How to turn Image object into grayscale and display itJS - 如何将Image对象变成灰度并显示
【发布时间】:2016-05-11 22:57:30
【问题描述】:

基本上,当一个按钮被点击时,它会告诉移动设备去摄像头。一旦相机拍照,它就会给我图像数据(它是否称为数据 URL?)。这是我处理它的代码:

var imagesrc = "data:image/jpeg;base64," + imageData;

var myimage = new Image(500, 500);
myimage.src = imagesrc;            <---- to populate the object with the colored image
myimage.src = grayscale(myimage);  <---- here I set it to the grayscale image

我想调用一个名为grayscale() 的方法,让它返回已经变成灰度的图像。我试过这个:

function grayscale(image){
    var canvasContext = canvas.getContext('2d');
    var imgW = image.width;
    var imgH = image.height;
    canvas.width = imgW;
    canvas.height = imgH;

    canvasContext.drawImage(image, 0, 0);

    var imgPixels = canvasContext.getImageData(0, 0, imgW, imgH);


    for(>var y = 0; y < imgPixels.height; y++){
        for(>var x = 0; x < imgPixels.width; x++){
          var i = (y * 4) * imgPixels.width + x * 4;
          var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
          imgPixels.data[i] = avg;
          imgPixels.data[i + 1] = avg;
          imgPixels.data[i + 2] = avg;
        }
    }

    canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);

    dataurl = canvas.toDataURL();
    var newimg = "data:image/jpeg;base64," + dataurl;
    return newimg;
}

但由于某种原因它不起作用。它只是不显示灰度图像。我在网上找到了 for 循环代码并对其进行了调整。

【问题讨论】:

  • 如何调整它?它最初是做什么的(并且确实有效)?
  • 究竟是什么“不起作用”?你做了一些调试吗?意外行为在哪里?
  • 呃,toDataURL 已经返回了一个完整的数据 URL,你不需要添加前缀(而且它不会是 jpeg)

标签: javascript image data-url


【解决方案1】:

这不起作用有几个原因。开始检查控制台输出以跟踪错误对您来说是一件好事。例如,Firefox "F12" 会告诉您 for(&gt;var ...) 是个问题。 ;)

您是否在与我们共享的代码之外的某个地方声明了canvasdataurl 声明了吗?不需要toDataUrl的前缀...

这是我在你的 for 循环周围键入的一个基本 html 文件,它确实将“test.png”变为灰色。也许您想将它保存在某个地方,将 png 放入同一个文件夹中,然后逐步开始编辑内容,而不是复制代码。如果您愿意接受挑战,请尝试通过http://jslint.com/! (我猜你必须用 while 循环替换 for 循环)。 :)

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Canvas/ImgData Test</title>
</head>

<body>
    <canvas id="output"></canvas>
    <script>
        var cnv = document.getElementById('output');
        var cnx = cnv.getContext('2d');

        function grey(input) {
            cnx.drawImage(myimage, 0 , 0);
            var width = input.width;
            var height = input.height;
            var imgPixels = cnx.getImageData(0, 0, width, height);

            for(var y = 0; y < height; y++){
                for(var x = 0; x < width; x++){
                    var i = (y * 4) * width + x * 4;
                    var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
                    imgPixels.data[i] = avg;
                    imgPixels.data[i + 1] = avg;
                    imgPixels.data[i + 2] = avg;
                }
            }

            cnx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
        }

        var myimage = new Image();
        myimage.onload = function() {
            grey(myimage);
        }
        myimage.src = "test.png";
    </script>
</body>
</html>

【讨论】:

    【解决方案2】:

    我知道您正在寻找将 dataURI 转换为灰度但是,如果您想将视频反馈本身转换为灰度或将任何图像转换为灰度,您可以使用此代码。

    .gray {
      filter: grayscale();
    }
     <!--hey use this style to show in gray scale. can even use to convert image to grayscale-->
     <video id="camera-stream" class="gray" ></video>

    【讨论】:

      【解决方案3】:

      您不应取 3 个颜色分量的平均值,因为它们的亮度差异很大(100% 的绿色比 100% 的蓝色亮很多)。电视系统(PAL 和 NTSC)将灰度图像的亮度定义为 29.9% 红 + 58.7% 绿 + 11.4% 蓝。

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2012-12-30
        • 2022-11-18
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多