Przykład zastosowania LINQ do zmiany nazw wielu plików.
Proszę sobie wyobrazić, że mam ok. 2000 takich plików:
animacja (1).jpg
animacja (2).jpg
animacja (3).jpg
...
animacja (100).jpg
...
animacja (2000).jpg
i chciałbym stworzyć z tych obrazów animacje poklatkową.
Niestety program do robienia animacji nie rozumie, że powinien utworzyć
film układając obrazki w kolejności numerów w nawiasach, tylko układa sortując wg. nazw.
Tak samo z resztą jak metoda Directory.GetFiles():
Jak widać kolejność jest do niczego i animacja nie wyjdzie, jeśli złożę obrazki w tej kolejności.
Chciałbym więc pozmieniać nazwy tych plików na:
00001.jpg
00002.jpg
00003.jpg
...
00100.jpg
...
02000.jpg
Oczywiście kolejność numerów w nawiasach musi zostać zachowana, bo inaczej animacja będzie bez sensu.
Można to zrobić korzystając z LINQ!
var OrderedList =
from file2 in
(from file in Directory.GetFiles(@"F:\film", "*.jpg")
select new
{
// Pewnie jakoś bardziej elegancko da się wyłuskać numer z nazwy
Nr = Convert.ToInt32(string.Join(null, Regex.Split(file, "[^\\d]"))),
FInfo = new FileInfo(file)
})
orderby file2.Nr // Sortowanie po znalezionym numerze
select file2;
// teraz można zmieniać nazwy
foreach(var elmnt in OrderedList)
elmnt.FInfo.MoveTo(string.Format("{0}\\{1}.jpg", elmnt.FInfo.DirectoryName, elmnt.Nr.ToString("0000#")));
Przed zmianą nazw podejrzałem sobie jak wygląda OrderedList:
Nawiasem pisząc, animację poklatkową z wielu obrazków jpg można stworzyć programem ffmpeg, który jest na Ubuntu (hi hi hi):
ffmpeg -r 8 -b 1800 -i /media/DANE/film/%05d.jpg -f avi -vcodec mjpeg ~/Film.avi
Niestety przy takiej liczbie fotografii Windows Movie Maker odmówił współpracy, a ffmpeg przemielił wszystko w parę sekund.
Na koniec można dodać muzykę od filmu takim poleceniem:
mencoder ~/Film.avi -o film2.avi -ovc copy -oac copy -audiofile ~/Film.mp3
A oto link do mojej wspaniałej animacji:
http://www.youtube.com/watch?v=9YdFJGT1_xk