2016-08-30 3 views
1

Ich arbeite an einem Extendscript-Tool für Adobe After Effects, und ich versuche, eine Sache herauszufinden. Extendscript ist nur Javascript mit einigen Adobe Fluff hinzugefügt, aber so ziemlich alles Javascript, das nicht browserspezifisch funktioniert.Javascript Array von Bildsequenzen - nur das erste Bild in Folge

Ich habe ein Skript, das ich seit einiger Zeit verwende/entwickle, was den Import von Tausenden von Bildern in Bildsequenzen enorm vereinfacht. Alles funktioniert gut, aber es gibt einen bestimmten Bereich, der sehr langsam abläuft, wenn Sie in Tausende von Bildern kommen und ich versuche herauszufinden, wie ich es beschleunigen kann.

Was ich zu optimieren versuche, geht durch eine Reihe von potenziell Tausende von Bilddateien und verkettet es nur auf das erste Bild in der Sequenz. Zum Beispiel könnte mein Array lauten: [img.001.png, img.002.png, img.003.png, img.004.png, img.005.png] und was ich tun möchte ist, jede Instanz von " img. ###. png "außer dem ersten. Also nach meiner Funktion hätte ich einfach: [img.001.png].

Hier ist, wie ich es jetzt tun:
1) I Array Artikel A nehmen, regex, um die Zahlenfolge
2) dann Array-Element B, regex aus der Zahlenfolge
3) und vergleichen Sie die beiden zu sehen Sie, ob sie identisch sind. Wenn sie sind, splice ich Artikel B

Dies funktioniert 100% der Zeit, die ist super, aber ist ziemlich langsam, wenn Sie über tausend oder zwei Bilder bekommen ... Was ich versuche zu tun ist, einen Weg zu finden um diesen "Beschneidungs" schritt schneller zu machen. Ein Freund von mir erzählte mir, dass Regex ziemlich langsam ist, also muss ich es vielleicht ohne Regex machen? Ich fand auch mehrere native JavaScript-Array-Methoden, die helfen könnten, wie forEach() every() und filter(), aber ich sehe nicht, wie diese schneller sein werden, weil ich noch 2 Regex-Auswertungen machen muss, und ich brauche noch um die Gegenstände miteinander zu vergleichen.

Jede Hilfe würde immens geschätzt werden!

  • Spencer

Hier ist ein Ausschnitt aus meinem vorhandenen Code:

currentFolder = new Folder ("//12.34.5.67/my folder on the network/") 
var folderChildren = currentFolder.getFiles().sort(); 

var searcher = new RegExp("\\d{3,5}[.]"); 
for (var i = 0; i < folderChildren.length; i++) { 
    // Go through the array and strip out all elements that are the same once their numbers have been removed with a regex 
    if (i > 0) { 
     currentResult = searcher.exec(folderChildren[i].name); //check if a sequence 
     if (currentResult) { // it is a sequence 
      // first parse out the comparison strings - current item and item before 
      var testNameBefore = folderChildren[i-1].name; 

      //if we have a sequence before our current item, we need to delete the numbers. 
      var beforeNum = searcher.exec(testNameBefore); 
      if (beforeNum) { 
       testNameBefore = testNameBefore.substring(0, testNameBefore.length-8); 
      } 

      var testNameCurrent = folderChildren[i].name; 
      testNameCurrent = folderChildren[i].name.substring(0, testNameCurrent.length-8); 

      //compare to the element before it and delete if the same!! 
      if (testNameBefore == testNameCurrent) { 
       folderChildren.splice(i, 1); 
       i--; 
      } 
     } 
    } 
} 
+0

Ist das Dateiformat immer * .Number.png? – Jecoms

+0

Es endet immer in Number.png, aber nicht immer mit einem Punkt vor der Nummer. Und die Zahlenfolge ist nicht immer 3 Ziffern. – Spencer

Antwort

0

Sie keinen Code-Schnipsel haben zu vergleichen, aber dies läuft in wenigen Millisekunden.

var files = getFiles(), 
 
    cleanedFiles = getDesequencedArray(files); 
 

 
console.log(`Parsing ${files.length} files.`); 
 
console.log(`Found ${cleanedFiles.length} unique sequences:`); 
 
console.log(cleanedFiles); 
 

 
function getDesequencedArray(files) { 
 
    return files.reduce(
 
    function(memo, file) { 
 
     var sequence = file.match(/(.*)\.?\d{3,5}(.*)/); 
 
     if (sequence) { 
 
     if (!memo.found[sequence[1] + sequence[2]]) { 
 
      memo.found[sequence[1] + sequence[2]] = 1; 
 
      memo.files.push(file); 
 
     } 
 
     } else { 
 
     //Did you want the other files included too? 
 
     //memo.files.push(file); 
 
     } 
 
     return memo; 
 
    }, { 
 
     found: {}, 
 
     files: [] 
 
    } 
 
).files; 
 
} 
 

 
function getFiles() { 
 
    var files = [ 
 
    "img1.001.jpg", 
 
    "img1.002.jpg", 
 

 
    "img1.001.png", 
 
    "img1.002.png", 
 
    "img1.003.png", 
 
    "img1.004.png", 
 

 
    "img2.011.jpg", 
 
    "img2.012.jpg", 
 
    "img2.013.jpg", 
 
    "img2.014.jpg", 
 

 
    "img300001.png", 
 
    "img300002.png", 
 
    "img300003.png", 
 
    "img300004.png", 
 

 
    "img300002.100.png", 
 
    "img300002.200.png", 
 

 
    "readme.md", 
 
    "index.html" 
 
    ]; 
 

 

 
    // Adding a bunch of records 
 
    for (let x = 0; x < 100; x++) 
 
    for (
 
     let i = 1; 
 
     i <= 1000; 
 
     files.push(`img-${x}.` + ("00" + i++).substr(-3) + '.png') 
 
    ); 
 
    return files; 
 
}

+0

Sieht vielversprechend aus, ich werde es gleich ausprobieren! Danke für die Antwort. – Spencer

+0

Hey Malk, tut mir leid, ich habe das noch nicht probiert (mitten in einem Haufen Zeug ...), aber ich habe gerade diese Referenz auf der reduce-Methode überprüft: [link] (http://www.w3schools.com/jsref /jsref_reduce.asp) und ich glaube nicht, dass es funktionieren wird. Ich weiß, dass ich nicht angegeben habe, dass das Array wahrscheinlich _multiple_ Bildsequenzen gleichzeitig enthält! – Spencer

Verwandte Themen