
Habréには、 Microsoftの無料プログラムを使用してシネマグラフを受け取る方法に関する記事があります。 このトピックに興味があり、スクリプト言語Processingの簡単なスケッチを書くことにしました。 ここでどんなプログラミング言語が読めるか。 このような動画は、ほとんどのピクセルが透明な数十フレームのセットです。 すべての画像で、動くオブジェクトのある領域のみが不透明のままです。 最初のフレームは完全に表示され、背景です。
目的のアニメーションを取得するには、各フレームのアルファチャネルを編集する必要があります。 スクリプトのソース画像として、一連のキャンドルショットを使用しました。 スクリプトを実行した後、画面に表示される固定背景フレームは1つだけです。 アニメーションを表示する画像をクリックします。 アルゴリズムはリアルタイムで機能します。 アニメーションを保存するには、sキーを押します。 「out」ディレクトリは、スケッチのあるフォルダーに表示され、出力アニメーションのフレームが含まれます。 次に、Gimpをロードし、結果の画像をレイヤーとして開き、gif形式でアニメーションとして保存します。 スクリプトのソースコードは次のとおりです。
// Zurbaganin // 2012 int nFrames =15; // PImage[] imgs = new PImage[nFrames]; // PImage brush=new PImage (63, 63, RGB);// - void setup() { background(255); createBrush();// - size(1024, 768, P3D);// frameRate(25); // for (int k = 0; k < imgs.length; k++) { String imgName = nf(k, 2) + ".png";// imgs[k] = loadImage(imgName);// imgs[k].format=ARGB;// 32- } nullAlpha();//// } void draw() { int frame = frameCount % (nFrames);// image(imgs[frame], 0, 0);// } void createBrush() // { for (int i = 0; i < brush.height; i++) { for (int j = 0; j < brush.width; j++) { float gr; float a=dist(brush.width/2, brush.height/2, j, i); gr=92*(1-a/dist(brush.width/4, brush.height/4, 0, 0)); brush.pixels[i*brush.width+j]=color(gr); } } } void mousePressed() // . // { if (mouseButton == LEFT) { for (int k = 1; k < imgs.length; k++) { for (int i = 0; i < brush.height; i++) { for (int j = 0; j < brush.width; j++) { int i1=mouseY-brush.height/2+i; int j1=mouseX-brush.height/2+j; float r=(int)red(imgs[k].pixels[i1*imgs[k].width+j1]); float g=(int)green(imgs[k].pixels[i1*imgs[k].width+j1]); float b=(int)blue(imgs[k].pixels[i1*imgs[k].width+j1]); float a=(int)alpha(imgs[k].pixels[i1*imgs[k].width+j1]); a=a+(int)red(brush.pixels[i*brush.width+j]); if (a>255) { a=255; } // float a=255; imgs[k].pixels[i1*imgs[k].width+j1]=color(r, g, b, a); } } } } } void nullAlpha()// { for (int k = 1; k < imgs.length; k++) { for (int i = 0; i < imgs[k].height; i++) { for (int j = 0; j < imgs[k].width; j++) { float r=(int)red(imgs[k].pixels[i*imgs[k].width+j]); float g=(int)green(imgs[k].pixels[i*imgs[k].width+j]); float b=(int)blue(imgs[k].pixels[i*imgs[k].width+j]); float a=(int)alpha(imgs[k].pixels[i*imgs[k].width+j]); a=0;// imgs[k].pixels[i*imgs[k].width+j]=color(r, g, b, a); } } } } void keyPressed() { if (key == 's' || key == 'S') {// for (int k = 1; k < imgs.length; k++) { for (int i = 0; i < imgs[k].height; i++) { for (int j = 0; j < imgs[k].width; j++) { float r, g, b; float a=(int)alpha(imgs[k].pixels[i*imgs[k].width+j]); if (a==0) { r=(int)red(imgs[0].pixels[i*imgs[0].width+j]); g=(int)green(imgs[0].pixels[i*imgs[0].width+j]); b=(int)blue(imgs[0].pixels[i*imgs[0].width+j]); } else { r=(int)red(imgs[k].pixels[i*imgs[k].width+j]); g=(int)green(imgs[k].pixels[i*imgs[k].width+j]); b=(int)blue(imgs[k].pixels[i*imgs[k].width+j]); } a=255; // float a=255; imgs[k].pixels[i*imgs[k].width+j]=color(r, g, b, a); } } } for (int k = 0; k < imgs.length; k++) { imgs[k].save("/out/"+nf(k, 6)+".png"); } } }
スクリプトを適切に機能させるには、ソース画像を1024x768ピクセルのpng形式で保存し、スケッチディレクトリに移動する必要があります。 ファイル名は「01.png、02.png ... **。Png」のようになります。 nFramesパラメーターを使用して、コード内のフレーム数を示します。
このビデオはプログラムのデモです。
処理-フリーソフトウェア。インストールは不要で、LinuxおよびWindowsで正常に動作します。