c语言编程笔录

首页 >   > 笔记大全

笔记大全

ps如何换人物背景

更新时间:2023-10-14
首先需要明确一下,换人物背景一般是指在一张图片中修改人物的背景,而不是在多张图片之间进行切换。本文将介绍两种方法,一种是用Photoshop进行操作,另一种是用JavaScript和Canvas进行操作。 ## 用Photoshop进行换人物背景 Photoshop是一款广泛应用于图像处理的软件,我们可以用它来做一些比较复杂的图像操作,比如换人物背景。以下是具体操作步骤: ### 步骤一:打开图片 首先,我们需要打开需要进行编辑的图片。在Photoshop中,可以通过点击“文件”菜单,选择“打开”来打开需要编辑的图片。 ```html

打开图片代码示例:

<html>
  <body>
    <input type="file" id="file_input">

    <script>
      // 获取文件输入框
      var fileInput = document.querySelector('#file_input');
      
      // 绑定文件选中事件
      fileInput.addEventListener('change', function() {
        // 获取选中的文件
        var file = fileInput.files[0];
        
        // 判断文件类型是否为图片
        if (!file.type.startsWith('image/')) {
          alert('请选择一张图片!');
        } else {
          // 创建一个FileReader对象
          var reader = new FileReader();

          // 绑定读取文件完成事件
          reader.addEventListener('load', function () {
            // 将图片载入到Canvas中
          });

          // 读取文件
          reader.readAsDataURL(file);
        }
      });
    </script>
  </body>
</html>
上面的例子中,我们使用一个文件输入框来选择需要编辑的图片,并读取图片内容。现在我们需要将图片内容载入到Canvas中。 ### 步骤二:用Lasso工具选中人物 选择Lasso工具,用它选中人物。当选中的区域出现动画闪烁时,表示已经选好了。 ```html

用Lasso工具选中人物代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
        
        // 绑定鼠标事件
        canvas.addEventListener('mouseup', function(e) {
          var x = e.clientX - canvas.offsetLeft;
          var y = e.clientY - canvas.offsetTop;
          
          ctx.beginPath();
          ctx.strokeStyle = 'red';
          ctx.lineWidth = 1;
          ctx.arc(x, y, 5, 0, 2 * Math.PI);
          ctx.stroke();
          
          ctx.beginPath();
          ctx.fillStyle = 'rgba(255, 0, 0, 0.2)';
          ctx.fillRect(x - 50, y - 50, 100, 100);
        });
      };
    </script>
  </body>
</html>
上面的例子中,我们首先载入了一张图片,并将它绘制到了Canvas中。然后,我们绑定了鼠标事件,在鼠标点击时用一个圆圈标出点击位置,并在该位置周围画了一个红色的方框。这样就完成了用Lasso工具选中人物的操作。 ### 步骤三:选择取样背景 选择“选择”菜单,然后选择“选区中的颜色”,在弹出的对话框中选择需要进行选区的背景颜色。 ```html

选择取样背景代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
        
        canvas.addEventListener('mouseup', function(e) {
          var x = e.clientX - canvas.offsetLeft;
          var y = e.clientY - canvas.offsetTop;
          
          ctx.beginPath();
          ctx.strokeStyle = 'red';
          ctx.lineWidth = 1;
          ctx.arc(x, y, 5, 0, 2 * Math.PI);
          ctx.stroke();
          
          ctx.beginPath();
          ctx.fillStyle = 'rgba(255, 0, 0, 0.2)';
          ctx.fillRect(x - 50, y - 50, 100, 100);
          
          var pixelData = ctx.getImageData(x, y, 1, 1).data;
          
          console.log(pixelData);
        });
      };
    </script>
  </body>
</html>
上面的例子中,我们在鼠标点击事件中加了一行代码,用getImageData方法获取了鼠标点击位置的颜色信息。这里需要注意的是,getImageData是获取像素点的RGBA信息,我们需要将这个信息转换为颜色值。 ### 步骤四:移除背景 选择“画笔”工具,将背景擦除。如果需要反悔,可以选择“撤销”菜单来恢复画笔操作。 ```html

移除背景代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
        
        canvas.addEventListener('mousemove', function(e) {
          var x = e.clientX - canvas.offsetLeft;
          var y = e.clientY - canvas.offsetTop;
          
          if (e.buttons === 1) {
            ctx.beginPath();
            ctx.strokeStyle = 'white';
            ctx.lineWidth = 20;
            ctx.lineCap = 'round';
            ctx.lineJoin = 'round';
            ctx.moveTo(x, y);
            ctx.lineTo(x + 1, y + 1);
            ctx.stroke();
          }
        });
      };
    </script>
  </body>
</html>
上面的例子中,我们在Canvas上绑定了鼠标移动事件,并用鼠标移动的轨迹来模拟画笔进行擦除。 ## 用JavaScript和Canvas进行换人物背景 如果没有Photoshop软件,我们还可以用JavaScript和Canvas来进行换人物背景的操作。以下是具体实现方法: ### 步骤一:载入图片到Canvas ```html

载入图片代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
      };
    </script>
  </body>
</html>
上面的例子中,我们首先创建了一个Canvas元素,并在JavaScript中获取它的上下文。然后,我们新建了一个Image对象,并设置它的src属性为需要编辑的图片的路径。在图片加载完成时,我们设置了Canvas的宽高,并将这个图片绘制到Canvas中。 ### 步骤二:选中人物区域 ```html

选中人物区域代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      // 创建矩形框
      var rect = { x: 0, y: 0, w: 0, h: 0 };
      var drag = false;

      // 绑定鼠标事件
      canvas.addEventListener('mousedown', function(e) {
        rect.x = e.offsetX;
        rect.y = e.offsetY;
        drag = true;
      });
      canvas.addEventListener('mousemove', function(e) {
        if (drag) {
          rect.w = e.offsetX - rect.x;
          rect.h = e.offsetY - rect.y;
          draw();
        }
      });
      canvas.addEventListener('mouseup', function() {
        drag = false;
      });

      // 绘制矩形框
      function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.save();
        ctx.beginPath();
        ctx.strokeStyle = 'yellow';
        ctx.lineWidth = 2;
        ctx.rect(rect.x, rect.y, rect.w, rect.h);
        ctx.stroke();
        ctx.restore();
      }

      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
      };
    </script>
  </body>
</html>
上面的例子中,我们在Canvas上绑定了鼠标事件,并记录了鼠标的移动轨迹来选中人物。其中,mousedown事件记录了鼠标按下的位置;mousemove事件记录了鼠标移动的轨迹,并在这个过程中重绘了Canvas并用矩形框来标志出来;mouseup事件标志着鼠标移动结束。 ### 步骤三:分离人物和背景 ```html

分离人物和背景代码示例:

<html>
  <body>
    <canvas id="canvas"></canvas>
    
    <script>
      // 获取Canvas和上下文
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');
      
      // 载入图片到Canvas
      var img = new Image();
      img.src = 'image.png';
      
      // 创建矩形框
      var rect = { x: 0, y: 0, w: 0, h: 0 };
      var drag = false;

      // 绑定鼠标事件
      canvas.addEventListener('mousedown', function(e) {
        rect.x = e.offsetX;
        rect.y = e.offsetY;
        drag = true;
      });
      canvas.addEventListener('mousemove', function(e) {
        if (drag) {
          rect.w = e.offsetX - rect.x;
          rect.h = e.offsetY - rect.y;
          draw();
        }
      });
      canvas.addEventListener('mouseup', function() {
        drag = false;
        separate();
      });

      // 绘制矩形框
      function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.save();
        ctx.beginPath();
        ctx.strokeStyle = 'yellow';
        ctx.lineWidth = 2;
        ctx.rect(rect.x, rect.y, rect.w, rect.h);
        ctx.stroke();
        ctx.restore();
      }

      // 分离人物和背景
      function separate() {
        var imageData = ctx.getImageData(rect.x, rect.y, rect.w, rect.h);

        for (var i = 0; i < imageData.data.length; i += 4) {
          var r = imageData.data[i];
          var g = imageData.data[i + 1];
          var b = imageData.data[i + 2];
          var a = imageData.data[i + 3];

          if (r + g + b < 200 || a === 0) {
            imageData.data[i + 3] = 0;
          }
        }

        ctx.putImageData(imageData, rect.x, rect.y);
        rect = { x: 0, y: 0, w: 0, h: 0 };
      }

      img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        
        ctx.drawImage(img, 0, 0);
      };
    </script>
  </body>
</html>
上面的例子中,我们创建了一个separate函数来分离人物和背景。在这个函数中,我们用getImageData方法来获取选中的区域的像素信息,并在这个过程中把背景像素的alpha通道设为0。最后,我们使用putImageData方法将处理后的像素信息绘制到Canvas中。