Обработка и пиксели

Я хочу создать простой фильтр, используя класс MOVIE при обработке. Однако у меня проблема с размером фильма. Работа над фильтром продолжается, пожалуйста, не судите меня :)

import processing.video.*;

Movie theMov; 
int size;

void setup() { 

  theMov = new Movie(this, "fargo.mp4");
  theMov.play();
  theMov.read();
  size(displayWidth, displayHeight);
  noStroke();
  size = 10;
}

void draw() { 
  //image(theMov, 0, 0, width, height);
  theMov.loadPixels();
  for (int i = 0; i < theMov.width; i+=size) {
    for (int j = 0; j < theMov.height; j+=size) {
      color c = theMov.pixels[i+j*theMov.width];
      fill(c);
      rect(i, j, size, size);
    }
  }
  updatePixels();
  size = (int)random(10, 20);
} 

void movieEvent(Movie m) { 
  m.read();
} 

Как мне это сделать, если я хочу, чтобы фильм был полноэкранным? В настоящее время он заполняет только небольшую часть экрана. Я хочу иметь возможность отображать фильм в полноэкранном режиме, чтобы функция loadPixels () загружала фильм в полноэкранном режиме.


person Arash Saidi    schedule 03.06.2014    source источник
comment
Я вижу, что вы пытаетесь сделать (если я правильно понимаю), но, к сожалению, класс Movie очень ограничен. Вы определенно можете изменить размер видео и заставить его занимать весь экран, используя image(theMov, 0, 0, width, height);, но это никак не повлияет на ваш расчет пикселей, поскольку он не меняет размер видеокадра навсегда. В библиотеке изображений есть функция изменения размера, которая не работает с видео, но вы можете преобразовать видео в последовательность изображений, изменить их размер, а затем прочитать их в потоке для выполнения своей операции. .   -  person nico_c    schedule 04.06.2014
comment
Это действительно запутано, но я не знаю другого способа сделать это, кроме использования внешней библиотеки, которая может постоянно преобразовывать размер видео в желаемый размер. Если бы это был я и мне нужно было быстрое исправление, я бы создал метод, который преобразовывал бы видео в последовательность изображений, а затем читал бы его обратно в последовательности и выполнял бы операцию с пикселями. Но это было бы быстрое решение, а не что-то постоянное.   -  person nico_c    schedule 04.06.2014
comment
Обидно, но разве нет возможности изменить размер фильма? Это должен быть основной метод, не так ли?   -  person Arash Saidi    schedule 04.06.2014
comment
Должен быть, есть один для изображений с именем resize(), но его эквивалента для видео не существует. Но я посмотрю вокруг, не пропущу ли я чего-нибудь и вернусь. В противном случае, надеюсь, кто-то другой может что-то предложить.   -  person nico_c    schedule 04.06.2014


Ответы (1)


Поскольку вы «рисуете» каждый прямоугольник кадра за прямоугольником, вы можете просто вычислить новое «положение» и «размер» для этих прямоугольников:

float ratioX = (float)width / theMov.width;
float ratioY = (float)height / theMov.height;

В зависимости от вашего соотношения сторон вам следует изменить этот расчет. А затем просто нарисуйте прямоугольник с новым «размером» в новой «позиции»:

rect(i * ratioX, j * ratioY, size * ratioX, size * ratioY);
person Majlik    schedule 04.06.2014
comment
Спасибо, Маджлик, но не могли бы вы подробнее объяснить, как и почему это работает? Я не понимаю, что ты делаешь? - person Arash Saidi; 04.06.2014
comment
Теоретически это линейная интерполяция, используемая для изменения размера изображения (массива пикселей). Или, используя интуицию, вы хотите нарисовать нижний правый (максимальный) пиксель из видеокадра в максимальный пиксель на холсте и т.д. для всех пикселей, но в вашем случае мы можем увеличить размер пикселей, потому что вы используете прямоугольники, поэтому мы используем то же соотношение для увеличения размера всего видео. . Если вы не используете этот фильтр, вы должны использовать более сложный метод изменения размера фреймов ... вот так - person Majlik; 04.06.2014