2012-09-23 13 views
8

मैं एक लंबे समय पीएचपी साथ एक एनिमेटेड GIF से तख्ते निकालने के लिए कैसे के लिए खोज के साथ एक एनिमेटेड GIF के फ्रेम को निकालने के लिए कैसे ... unfortunaly मैं सिर्फ कैसे उनकी अवधि पाने के लिए मिला ...पीएचपी

मैं वास्तव में प्रत्येक आकार पर कुछ आकार बदलने, घुमाने, आदि लागू करने के लिए जीआईएफ फ्रेम और उनकी अवधि निकालने की आवश्यकता है और फिर संपादित फ्रेम के साथ जीआईएफ को पुन: उत्पन्न करने की आवश्यकता है!

मैं किसी भी सॉफ्टवेयर, बाहरी लाइब्रेरी (जैसे ImageMagick) का उपयोग नहीं करना चाहता, सिर्फ PHP: वास्तव में मुझे एनिमेटेड जीआईएफ के साथ काम करने के लिए मेरी कक्षा http://phpimageworkshop.com/ को अनुमति देने की आवश्यकता है।

यदि आपको कोई विचार है, तो मैं आपको ^^ सुन रहा हूं!

+0

, आप नहीं कर सकते। –

+2

जैसा कि आप देख सकते हैं कि मुझे एक वर्ग मिलता है जो प्रत्येक फ्रेम को केवल PHP के साथ आकार देता है: https://gist.github.com/3769812 तो यह संभव है लेकिन कक्षा अच्छी तरह से प्रलेखित नहीं है। यदि किसी के पास कोई आसान समाधान नहीं है तो मैं इन सभी लाइनों की जांच और समझूंगा: – Sybio

उत्तर

20

मैंने अपने दिन को केवल 12 PHP का उपयोग करने के लिए this one पर आधारित कक्षा बनाने के लिए बिताया!

आप इसे यहाँ पा सकते हैं: https://github.com/Sybio/GifFrameExtractor

अपने जवाब के लिए धन्यवाद!

1

मैं करते हैं, किसी भी सॉफ्टवेयर, बाह्य पुस्तकालय (ImageMagick की तरह)

ठीक है, उस के साथ अच्छे भाग्य उपयोग करने के लिए नहीं चाहते हैं, क्योंकि कार्यक्षमता का 90% पीएचपी क्रम को जेंड इंजन निर्यात आता है पुस्तकालयों से।

यदि आपको कोई विचार है, तो मैं आपको ^^ सुन रहा हूं!

जीआईएफ प्रारूप में बाइनरी डेटा पार्स करें। आप अनपॅक(), अन्य चीजों के साथ उपयोग कर सकते हैं।

+0

एनिमेटेड gif के फ्रेम को तोड़ने के लिए आप अनपैक का उपयोग कैसे करेंगे? –

+0

मेरा उत्तर "अन्य चीजों के साथ" नियमित प्रोग्रामिंग संरचनाओं, लूप, शर्तों की तरह उल्लेख करता है। "अनपैक()" कीवर्ड नहीं है, लेकिन ** पार्स ** है। – Flavius

+1

सहमत हैं कि पार्सिंग यहां कुंजी है। ऐसा लगता है कि 'अनपैक()' एनिमेटेड gif फ्रेम प्राप्त करने का एक व्यवहार्य तरीका नहीं है, कम से कम मैं जो प्रारूपों को देख सकता हूं, उसे देखकर मैं क्या कह सकता हूं।http://php.net/manual/en/function.pack.php –

3

ठीक है, मैं वास्तव में इस तरह से ऐसा करने की अनुशंसा नहीं करता हूं, लेकिन यहां एक विकल्प है। एनिमेटेड gifs वास्तव में एक विभाजक, \ \ 0000 \ x21 \ xF9 \ x04 "द्वारा एकत्रित gifs की एक संख्या है। यह जानकर, आप छवि को स्ट्रिंग के रूप में PHP में खींचें, एक विस्फोट चलाएं, और अपने परिवर्तन को चलाने वाले सरणी के माध्यम से लूप करें। कोड इस तरह कुछ दिख सकता है।

$image_string = file_get_contents($image_path); 

$images = explode("\x00\x21\xF9\x04", $image_string); 

foreach($images as $image) { 
    // apply transformation 
} 

$new_gif = implode("\x00\x21\xF9\x04", $images); 

मैं 100% फिर से श्रृंखलाबद्ध, छवि की बारीकियों के बारे में सुनिश्चित नहीं कर रहा हूँ, लेकिन यहाँ wikipedia page regarding the file format of animated GIFs है।

+0

मैंने आपके समाधान की कोशिश की लेकिन यह काम नहीं करता है :(वैसे भी धन्यवाद ^^ – Sybio

2

मैं https://github.com/stil/gif-endec लाइब्रेरी का लेखक हूं, जो स्वीकार किए गए उत्तर से Sybio/GifFrameExtractor लाइब्रेरी से जीआईएफ को डीकोड करने में काफी तेजी से (लगभग 2.5 गुना) है। इसमें कम स्मृति उपयोग भी है, क्योंकि यह आपको एक बार में स्मृति के लिए सब कुछ लोड किए बिना, डीकोड समय पर एक फ्रेम को संसाधित करने की अनुमति देता है।

छोटे कोड उदाहरण:

<?php 
require __DIR__ . '/../vendor/autoload.php'; 

use GIFEndec\Events\FrameDecodedEvent; 
use GIFEndec\IO\FileStream; 
use GIFEndec\Decoder; 

/** 
* Open GIF as FileStream 
*/ 
$gifStream = new FileStream("path/to/animation.gif"); 

/** 
* Create Decoder instance from MemoryStream 
*/ 
$gifDecoder = new Decoder($gifStream); 

/** 
* Run decoder. Pass callback function to process decoded Frames when they're ready. 
*/ 
$gifDecoder->decode(function (FrameDecodedEvent $event) { 
    /** 
    * Write frame images to directory 
    */ 
    $event->decodedFrame->getStream()->copyContentsToFile(
     __DIR__ . "/frames/frame{$event->frameIndex}.gif" 
    ); 
}); 
प्रतिबंध के अपने सेट के साथ