Вращающийся массив 1d RGBA - PullRequest
0 голосов
/ 01 июня 2018

Я работаю с массивом RGBA 1D, который выглядит следующим образом:

pixelArray =[0,0,0,255,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255];

Чему соответствует этот pixelArray, когда нарисовано 2 черных пикселя и 4 белых пикселя:

BB
WW
WW

Моя цель состоит в том, чтобы повернуть порядок пикселей внутри массива, чтобы изображение при рисовании выглядело как

BWW  or WWB
BWW     WWB

Что означает, что мне нужно преобразовать pixelArray в

rotatedPixelArray = [0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255]

Приведенный выше пример - это просто пример.Фактическая rgba может представлять любое изображение и иметь длину более 1 миллиона.Я пробовал различные алгоритмы , такие как , и преобразовывал их в двумерный массив, а затем вращал и выравнивал (что работает), но я хотел бы избежать этого, потому что скорость / память - это проблема.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Может быть, это может быть полезно в p5.js для поворота на 90 градусов (влево и вправо) (предыдущее предлагаемое решение, похоже, имеет небольшую «асимметричную» ошибку):

function rotateRight(img){

  var w = img.width;
  var h = img.height;
  var index, indexr;
  var img2 = createImage(w, h);

  img.loadPixels();
  img2.loadPixels();

  indexr = 0;

  for (let x = 0; x < w; x++) {

    for(let y = h - 1; y >= 0; y--) {

      index = (x+y*w)*4;
      img2.pixels[indexr] = img.pixels[index];
      img2.pixels[indexr + 1] = img.pixels[index+1];
      img2.pixels[indexr + 2] = img.pixels[index+2];
      img2.pixels[indexr + 3] = img.pixels[index+3];

      indexr += 4;

    }
  }

  img.updatePixels();
  img2.updatePixels();

  return img2;

}


function rotateLeft(img){

  var w = img.width;
  var h = img.height;
  var index, indexr;
  var img2 = createImage(w, h);

  img.loadPixels();
  img2.loadPixels();

  indexr = 0;

  for (let x = w - 1; x >= 0; x--) {

    for(let y = 0; y < h; y++) {

      index = (x+y*w)*4;
      img2.pixels[indexr] = img.pixels[index];
      img2.pixels[indexr + 1] = img.pixels[index+1];
      img2.pixels[indexr + 2] = img.pixels[index+2];
      img2.pixels[indexr + 3] = img.pixels[index+3];

      indexr += 4;

    }
  }

  img.updatePixels();
  img2.updatePixels();

  return img2;

}
0 голосов
/ 01 июня 2018

Так что я понял, в моем случае это нужно было повернуть влево или вправо.Код, который я использовал, выглядит следующим образом:

function rotatePixelArray(pixelArray,w,h) {
  var rotatedArray = [];

  for (var x=0;x<w;x++) {
    for(var y=0;y<h;y++) {
      index = (x+y*w)*4;
      rotatedArray.push(pixelArray[index]);
      rotatedArray.push(pixelArray[index+1]);
      rotatedArray.push(pixelArray[index+2]);
      rotatedArray.push(pixelArray[index+3]);
    }
  }

  return rotatedArray;
}

Чтобы повернуть его обратно, вы можете передать переключенные переменные w, h.

...