Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.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中的照片马赛克_Javascript_Jquery - Fatal编程技术网

javascript中的照片马赛克

javascript中的照片马赛克,javascript,jquery,Javascript,Jquery,是否有jquery插件或javascript库来生成照片马赛克(即创建由较小图像组成的图像)?(cf:)我已经创建了一个JS解决方案,用于使用瓷砖的平均颜色创建photomosaic function photomosaic(image) { // Dimensions of each tile var tileWidth = TILE_WIDTH; var tileHeight = TILE_HEIGHT; //creating the ca

是否有jquery插件或javascript库来生成照片马赛克(即创建由较小图像组成的图像)?(cf:)

我已经创建了一个JS解决方案,用于使用瓷砖的平均颜色创建photomosaic

 function photomosaic(image) {
      // Dimensions of each tile
      var tileWidth = TILE_WIDTH;
      var tileHeight = TILE_HEIGHT;

      //creating the canvas for photomosaic
      var canvas = document.createElement('canvas');
      var context = canvas.getContext("2d");
      canvas.height = image.height;
      canvas.width = image.width;

      var imageData = context.getImageData(0, 0, image.width, image.height);
      var pixels = imageData.data;

      // Number of mosaic tiles
      var numTileRows = image.width / tileWidth;
      var numTileCols = image.height / tileHeight;


      //canvas copy of image
      var imageCanvas = document.createElement('canvas');
      var imageCanvasContext = canvas.getContext('2d');
      imageCanvas.height = image.height;
      imageCanvas.width = image.width;
      imageCanvasContext.drawImage(image, 0, 0);


      //function for finding the average color
      function averageColor(row, column) {
          var blockSize = 1, // we can set how many pixels to skip

              data, width, height,
              i = -4,
              length,
              rgb = {
                  r: 0,
                  g: 0,
                  b: 0
              },
              count = 0;          

          try {
              data = imageCanvasContext.getImageData(column * TILE_WIDTH, row * TILE_HEIGHT, TILE_HEIGHT, TILE_WIDTH);
          } catch (e) {
              alert('Not happening this time!');
              return rgb;
          }

          length = data.data.length;

          while ((i += blockSize * 4) < length) {
              ++count;
              rgb.r += data.data[i];
              rgb.g += data.data[i + 1];
              rgb.b += data.data[i + 2];
          }

          // ~~ used to floor values
          rgb.r = ~~(rgb.r / count);
          rgb.g = ~~(rgb.g / count);
          rgb.b = ~~(rgb.b / count);

          return rgb;

      }

      // Loop through each tile
      for (var r = 0; r < numTileRows; r++) {
          for (var c = 0; c < numTileCols; c++) {
              // Set the pixel values for each tile
              var rgb = averageColor(r, c)
              var red = rgb.r;
              var green = rgb.g;
              var blue = rgb.b;

              // Loop through each tile pixel
              for (var tr = 0; tr < tileHeight; tr++) {
                  for (var tc = 0; tc < tileWidth; tc++) {

                      // Calculate the true position of the tile pixel
                      var trueRow = (r * tileHeight) + tr;
                      var trueCol = (c * tileWidth) + tc;

                      // Calculate the position of the current pixel in the array
                      var pos = (trueRow * (imageData.width * 4)) + (trueCol * 4);

                      // Assign the colour to each pixel
                      pixels[pos + 0] = red;
                      pixels[pos + 1] = green;
                      pixels[pos + 2] = blue;
                      pixels[pos + 3] = 255;
                  };
              };
          };
      };

      // Draw image data to the canvas
      context.putImageData(imageData, 0, 0);
      return canvas;
  }

  function create() {
      var image = document.getElementById('image');
      var canvas = photomosaic(image);
      document.getElementById("output").appendChild(canvas);
  };
function photomosic(图像){
//每个瓷砖的尺寸
var tileWidth=瓷砖宽度;
var tileHeight=瓷砖高度;
//为photomosaic创建画布
var canvas=document.createElement('canvas');
var context=canvas.getContext(“2d”);
canvas.height=image.height;
canvas.width=image.width;
var imageData=context.getImageData(0,0,image.width,image.height);
var像素=imageData.data;
//马赛克瓷砖的数量
var numTileRows=image.width/tileWidth;
var numTileCols=image.height/tileHeight;
//图像的画布副本
var imageCanvas=document.createElement('canvas');
var imageCanvasContext=canvas.getContext('2d');
imageCanvas.height=image.height;
imageCanvas.width=image.width;
drawImage(图像,0,0);
//用于查找平均颜色的函数
函数averageColor(行、列){
var blockSize=1,//我们可以设置跳过多少像素
数据、宽度、高度、,
i=-4,
长度,
rgb={
r:0,
g:0,
b:0
},
计数=0;
试一试{
data=imageCanvasContext.getImageData(列*平铺宽度,行*平铺高度,平铺高度,平铺宽度);
}捕获(e){
警报(“这次没有发生!”);
返回rgb;
}
长度=data.data.length;
而((i+=块大小*4)<长度){
++计数;
rgb.r+=data.data[i];
rgb.g+=data.data[i+1];
rgb.b+=data.data[i+2];
}
//~~用于确定下限值
rgb.r=~~(rgb.r/计数);
rgb.g=~~(rgb.g/计数);
rgb.b=~~(rgb.b/计数);
返回rgb;
}
//在每个瓷砖上打圈
对于(var r=0;r

演示:

这不是更适合作为服务器端工作吗?也许称为“PhotoMosaic”的jQuery插件值得一看。