سؤال

أحاول أن أفهم كيفية إزالة الإطارات من GIF المتحركة.

حاليا أحاول ذلك (كاختبار):

$count = 1;
foreach ($_im AS $frame) {
    if ($count > 1) { $frame->removeImage(); }
    $count++;        
}

ومع ذلك، يبدو أن هذا نخب كل شيء في الكائن.

اقتراحات من زملاء العمل كانت فقط لإنشاء كائن IM آخر، واستخرج Famee There، وما إلى ذلك. يبدو أن الفوضى للغاية.

هل كانت مفيدة؟

المحلول

لقد كنت تمر Imagick وثائق لفترة من الوقت، وحاولت بضعة أشياء ... لكنني لم أمكن أن أفعل ما تريد أيضا - لذلك، نحن على الأقل اثنين من لا يستطيعون معرفة طريقة نظيفة ^^

على أي حال، الطريقة الوحيدة التي تمكنت من إزالة إطار لصورة GIF الرسوم المتحركة هي إنشاء واحدة جديدة، تحتوي فقط على الإطارات التي لا أريد إزالتها :-(


النظر في تحميل صورة بهذه الطريقة:

// Load the existing image
$image = new Imagick(dirname(__FILE__) . '/animated-gif-source.gif');

(هذا هو GIF متحرك، مع 3 إطارات؛ أريد "إزالة" الثاني).


كما قلت، الطريقة الوحيدة التي وجدت "إزالة الإطار" هي هذه واحدة:

$new_image = new Imagick();

$i = 1;
foreach ($image as $frame) {
    if ($i===1 || $i===3) {
        // 3 frames ; we keep the first and third one
        // ie, remove the second one
        $new_image->addImage($frame->getImage());
    }
    $i++;
}

لذا :

  • إنشاء صورة جديدة
  • تكرر أكثر من إطارات واحد orignal
  • إذا كان الإطار الحالي هو واحد أريد الاحتفاظ به، فقم بنسخه إلى الصورة الجديدة


وفي النهاية، إخراج الصورة إلى المتصفح:

// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();

أو، لكتابة ملف:

// To write the new image to a file
// Must use writeImages, and not writeImage (multi-frames ! )
$new_image->writeImages(dirname(__FILE__) . '/animated-gif-output.gif', true);

تحتوي كل واحد من هذه المخرجات فقط على الإطارات الأولى والثالثة؛ لذلك، إنها تعمل ...
ولكن كما قلت، لا يشعر بالرضا :-(


من المحتمل أن تعمل على ما يرام لمعظم الصور، كما أعتقد؛ قد تشير إلى مشاكل مع الصور الكبيرة، ولكن صور متحركة عموما ليست كبيرة ... هل هم ؟


قد تستخدم الطريقة الأخرى تحويل من سطر الأوامر ... ولكن ... ليس هذا رائعا، ولم أجد طريقة لإزالة إطار فقط مع هؤلاء :-(

نصائح أخرى

لقد استخدمت فقط أدوات مساعدة سطر الأوامر للحصول على IM.

تحويل srcimage.gif [0] dstimage.gif

يجب أن تفعل الخدعة ما لم نسيت خيارا.

0] يشير إلى الإطار الأول من GIF المتحركة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top