Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmniejszenie animowanego GIFa
Forum PHP.pl > Forum > PHP
deha21
Potrzebuję zmniejszyć rozmiar(rozdzielczość) animowanego GIFa. Mam taki kod jak poniżej. Wszysko się pomniejsza i dodaje watermark, ale jest stopklatka a chciałbym, żeby GIF pozostał animowany. Czytałem w necie o różnych bibliotekach, które to umożliwiają. Niestety nie mogą żadnej dodać. Czy jest możliwość zrobić to jakoś bez bibliotek?
(ten kawałek który wykomentował jest chyba nie potrzebny, bo bez tego działa tak jak działało; znalazłem w necie i myślałem, że pomoże przy GIFie ale nie)
  1. function watermark($filef, $new_width, $new_height, $quality) {
  2.  
  3. $info = getimagesize($filef);
  4. if ($info === false) { return false; }
  5. $img = imagecreatefromgif($filef);
  6.  
  7. $th = imagecreatetruecolor($new_width, $new_height+25);
  8. $watermark = imagecreatefrompng('watermark.png');
  9.  
  10. /*
  11. imagealphablending($th, false);
  12. imagesavealpha($th,true);
  13. $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
  14. imagefilledrectangle($th, 0, 0, $new_width, $new_height, $transparent);
  15. */
  16.  
  17. imagecopyresampled($th, $img, 0, 0, 0, 0, $new_width, $new_height, $info[0], $info[1]);
  18. imagecopy($th, $watermark, $new_width-142, $new_height, 0, 0, 142, 25);
  19. imagegif($th, $filef, $quality);
  20.  
  21. imagedestroy($th);
  22. imagedestroy($img);
  23. return true;
  24.  
  25. }
Kshyhoo
Nie da rady. Jakaś biblioteka sobie radzi z animowanymi GIFami, nie pamiętam która...
deha21
Znalazłem GifFrameExtractor i GifCreator, które tworzą animowanego GIFa. Problem jest taki, że nie działa teraz watermark. Pewnie dlatego, że nie mam ImageWorkshop który jest chyba wymagany(?). Tutaj mam kawałek użytego kodu:
  1. if (GifFrameExtractor::isAnimatedGif($gifPath)) { // check this is an animated GIF
  2.  
  3. // Extractions of the GIF frames and their durations
  4. $gfe = new GifFrameExtractor();
  5. $frames = $gfe->extract($gifPath);
  6.  
  7. // Initialization of the watermark layer
  8. $watermark = ImageWorkshop::initFromPath('watermark.png');
  9.  
  10. $retouchedFrames = array();
  11.  
  12. // For each frame, we add a watermark and we resize it
  13. foreach ($frames as $frame) {
  14.  
  15. // Initialization of the frame as a layer
  16. $frameLayer = ImageWorkshop::initFromResourceVar($frame['image']);
  17.  
  18. $frameLayer->resizeInPixel($new_width, $new_height+25, true); // Resizing
  19. $frameLayer->addLayerOnTop($watermark, 0, 0, 'RB'); // Watermarking
  20.  
  21. $retouchedFrames[] = $frameLayer->getResult();
  22. }
  23.  
  24. // Then we re-generate the GIF
  25. $gc = new GifCreator();
  26. $gc->create($retouchedFrames, $gfe->getFrameDurations(), 0);
  27.  
  28. // And now save it !
  29. file_put_contents($filef, $gc->getGif());
  30. }


Idzie jakoś do tego dopisać ręcznie dodawanie watermarka, np. jak jak to robiłem wcześniej? Albo czy idzie jakoś sprawdzić czy jest ImageWorkshop zainstalowany? Serwer mam na az.pl i pewnie nie bedzie można dodać biblioteki dodatkowej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.