我想了解如何從動畫GIF中刪除幀。Imagick:從動畫GIF中刪除幀?
目前我想這(作爲測試):
$count = 1;
foreach ($_im AS $frame) {
if ($count > 1) { $frame->removeImage(); }
$count++;
}
然而,這似乎敬酒對象中的一切。
來自同事的建議是創建另一個即時通訊對象,並提取一個名稱,等等。然而,這似乎非常混亂。
我想了解如何從動畫GIF中刪除幀。Imagick:從動畫GIF中刪除幀?
目前我想這(作爲測試):
$count = 1;
foreach ($_im AS $frame) {
if ($count > 1) { $frame->removeImage(); }
$count++;
}
然而,這似乎敬酒對象中的一切。
來自同事的建議是創建另一個即時通訊對象,並提取一個名稱,等等。然而,這似乎非常混亂。
我一直在經歷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++;
}
所以:
並且,在結束時,輸出圖像到瀏覽器:
// 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);
每個這些輸出中的一個只包含第一幀和第三幀;所以,它正在工作......
但是,正如你說的,給人的感覺並不好:-(
它可能會工作得很好,對於大多數圖像,我想,你可能encouter大圖片的麻煩,但是動畫GIF是一般沒有那麼大... 是什麼人?
其他方式可能會使用命令行轉換......但是......不是非常好,我沒有找到一種方法,只是刪除一個框架與那些要麼:-(
我只使用IM的命令行實用程序。
轉換srcImage.gif [0] dstImage.gif
應該做的伎倆,除非我忘了一個選項。
[0]參照動畫gif的第一幀。
因此,這或多或少會拉出第一幀並將其放入另一個文件中?嗯。。好。這是我的同事的建議,但聽起來很亂。我想我會朝那個方向走。謝謝。 – Spot 2009-07-30 06:06:58
非常感謝。如果這是做到這一點的唯一方法,那麼這就是我要做的。 :)真的很欣賞簡潔的迴應。 – Spot 2009-08-01 23:14:27