Witam,
Mam picturebox'a, który wyświetla animowanego gifa. Chciałbym, żeby animował się tylko raz, po czym picturebox wyświetlał jego ostatnią klatkę. Gif jest zrobiony przeze mnie w Gimpie, gdzie ustawiłem, że ma się animować raz, a mimo to w programie robi to w nieskończoność.
Próbowałem zrobić nowy wątek, w którym program sprawdzałby, czy wyświetlana przez picturebox klatka nie jest ostatnią. Jeśli tak, to pauzowałby animację. Problem w tym, że nie bardzo wiem jak to zrobić. Czytałem o klasie ImageAnimator, ale nie wiem jak połączyć ją z picturebox'em.
Jakoś tak może? https://social.msdn.microsoft.com/Forums/vstudio/en-US/dfbcc7a6-da13-4fde-9ac4-7c26df5a6d42/a-gif-image-without-keep-looping?forum=vbgeneral
http://www.vbforums.com/showthread.php?626072-Loop-Once-Through-an-Animated-GIF
http://stackoverflow.com/questions/15647901/c-sharp-how-to-stop-animated-gif-from-continually-looping
Spróbowałem tak:
System.Drawing.ImageAnimator.StopAnimate(map.Image, OnFrameChanged);
map
to picturebox. Nie rozumiem jednak sensu istnienia drugiego parametru. OnFrameChanged
to u mnie funkcja pusta.
Udało mi się zastopować gifa. Jakby ktoś potrzebował:
picturebox.Enabled = false;
Jak widać, wystarczy go wyłączyć.
Teraz potrzebuję sprawdzić numer aktualnej klatki i ilość klatek w gifie. Jakieś pomysły?
Wszystkie klatki w gifie:
FrameDimension dimension;
dimension = new FrameDimension(this.pictureBox1.Image.FrameDimensionsList[0]);
int frameCount = this.pictureBox1.Image.GetFrameCount(dimension);
Niestety nie mam pojęcia jakby uzyskać aktualną klatkę.
Przepraszam za double, ale nie mam jeszcze konta.
To pokaż kod bo wrzuciłem na formę picturebox'a, do niego GIFa i dokładnie ten sam kod i pokazuje poprawnie.
@gogolon jeżeli masz Photoshopa to można zrobić takiego gifa z animacją jednokrotną i po problemie. Zakładka Timeline (ustawiasz czas wyświetlenia każdej warstwy i na koniec "ONCE" lub "FOREVER"). Zrobiłem Ci screena:
Dzięki za odpowiedź. Przy tworzeniu gifa korzystałem z Gimpa. Zaznaczyłem, że ma się animować tylko raz. Kiedy odtwarzam go w przeglądarce, wszystko działa jak powinno, w programie już nie :/
Potrzebuję jakiegoś pola lub metody, która zwróci mi aktualną klatkę wyświetlanej animacji. Gdybym miał te dane, skończyłbym warunek nie pozwalający na kolejne odtworzenie tego samego obrazka...
to powinno normalnie działać - oprócz ustawienia że GIF ma się uruchamiać raz możesz ustawić czas wyświetlania ostatniej klatki na nieskończoność lub przynajmniej kilka lat
albo zapisz w innym programie
osobiście zrezygnowałbym z gifów - możesz zrobić obrazek który będzie składał się z klatek obok siebie i wyświetlać w danym czasie określony obszar - w ten sposób masz pełną kontrolę nad wyświetlaniem - możesz w prosty sposób zmieniać czas wyświetlania, pauzować, stopować i zapętlać - tak na przykład działają emotki na facebooku. Oprócz tego obrazek może być wtedy w .png więc może zajmować mniej i mieć większą paletę barw