Help Lỗi background thành đen khi chuyển ảnh sang GIF

Careless

Private
Tham gia
19/06/2016
Bài viết
6
Được Like
1
Mình dùng PHPIMAGEWORKSHOP khi chuyển sang gif thì ảnh thành màu đen.
Ảnh sau khi chy\uyển sang GIF:
63e936ca-4173-11e7-8763-f7a7c6ce5d15.gif

Các thành phần:
blank.png
Blank.png
db1c1642-4185-11e7-8528-ca4c95b6ab61.png

db212ca4-4185-11e7-9c50-f1623087e239.png

e6a2e7e8-4185-11e7-8c8e-36349a8f9c24.png

077f80c0-4186-11e7-9812-a0b32690dde4.png

Code của mình:
PHP:
<?php
$rootpath = ''; 
require('main/_connect.php');
	use PHPImageWorkshop\ImageWorkshop;
	require_once($phpbb_root_path.'PHPImageWorkshop/ImageWorkshop.php');
	class GifCreator
{
    /**
     * @var string The gif string source (old: this->GIF)
     */
    private $gif;
    
    /**
     * @var string Encoder version (old: this->VER)
     */
	private $version;
    
    /**
     * @var boolean Check the image is build or not (old: this->IMG)
     */
    private $imgBuilt;

    /**
     * @var array Frames string sources (old: this->BUF)
     */
	private $frameSources;
    
    /**
     * @var integer Gif loop (old: this->LOP)
     */
	private $loop;
    
    /**
     * @var integer Gif dis (old: this->DIS)
     */
	private $dis;
    
    /**
     * @var integer Gif color (old: this->COL)
     */
	private $colour;
    
    /**
     * @var array (old: this->ERR)
     */
	private $errors;
 
    // Methods
    // ===================================================================================
    
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->reset();
        
        // Static data
        $this->version = 'GifCreator: Under development';
        $this->errors = array(
            'ERR00' => 'Does not supported function for only one image.',
    		'ERR01' => 'Source is not a GIF image.',
    		'ERR02' => 'You have to give resource image variables, image URL or image binary sources in $frames array.',
    		'ERR03' => 'Does not make animation from animated GIF source.',
        );
    }

	/**
     * Create the GIF string (old: GIFEncoder)
     * 
     * @param array $frames An array of frame: can be file paths, resource image variables, binary sources or image URLs
     * @param array $durations An array containing the duration of each frame
     * @param integer $loop Number of GIF loops before stopping animation (Set 0 to get an infinite loop)
     * 
     * @return string The GIF string source
     */
	public function create($frames = array(), $durations = array(), $loop = 0)
    {
		if (!is_array($frames) && !is_array($GIF_tim)) {
            
            throw new \Exception($this->version.': '.$this->errors['ERR00']);
		}
        
		$this->loop = ($loop > -1) ? $loop : 0;
		$this->dis = 2;
        
		for ($i = 0; $i < count($frames); $i++) {
		  
			if (is_resource($frames[$i])) { // Resource var
                
                $resourceImg = $frames[$i];
                
                ob_start();
                imagegif($frames[$i]);
                $this->frameSources[] = ob_get_contents();
                ob_end_clean();
                
            } elseif (is_string($frames[$i])) { // File path or URL or Binary source code
			     
                if (file_exists($frames[$i]) || filter_var($frames[$i], FILTER_VALIDATE_URL)) { // File path
                    
                    $frames[$i] = file_get_contents($frames[$i]);                    
                }
                
                $resourceImg = imagecreatefromstring($frames[$i]);
                
                ob_start();
                imagegif($resourceImg);
                $this->frameSources[] = ob_get_contents();
                ob_end_clean();
                 
			} else { // Fail
                
                throw new \Exception($this->version.': '.$this->errors['ERR02'].' ('.$mode.')');
			}
            
            if ($i == 0) {
                
                $colour = imagecolortransparent($resourceImg);
            }
            
			if (substr($this->frameSources[$i], 0, 6) != 'GIF87a' && substr($this->frameSources[$i], 0, 6) != 'GIF89a') {
			 
                throw new \Exception($this->version.': '.$i.' '.$this->errors['ERR01']);
			}
            
			for ($j = (13 + 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07))), $k = TRUE; $k; $j++) {
			 
				switch ($this->frameSources[$i] { $j }) {
				    
					case '!':
                    
						if ((substr($this->frameSources[$i], ($j + 3), 8)) == 'NETSCAPE') {
                            
                            throw new \Exception($this->version.': '.$this->errors['ERR03'].' ('.($i + 1).' source).');
						}
                        
					break;
                        
					case ';':
                    
						$k = false;
					break;
				}
			}
            
            unset($resourceImg);
		}
		
        if (isset($colour)) {
            
            $this->colour = $colour;
                                    
        } else {
            
            $red = $green = $blue = 0;
            $this->colour = ($red > -1 && $green > -1 && $blue > -1) ? ($red | ($green << 8) | ($blue << 16)) : -1;
        }
        
		$this->gifAddHeader();
        
		for ($i = 0; $i < count($this->frameSources); $i++) {
		  
			$this->addGifFrames($i, $durations[$i]);
		}
        
		$this->gifAddFooter();
        
        return $this->gif;
	}
    
    // Internals
    // ===================================================================================
    
	/**
     * Add the header gif string in its source (old: GIFAddHeader)
     */
	public function gifAddHeader()
    {
		$cmap = 0;

		if (ord($this->frameSources[0] { 10 }) & 0x80) {
		  
			$cmap = 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07));

			$this->gif .= substr($this->frameSources[0], 6, 7);
			$this->gif .= substr($this->frameSources[0], 13, $cmap);
			$this->gif .= "!\377\13NETSCAPE2.0\3\1".$this->encodeAsciiToChar($this->loop)."\0";
		}
	}
    
	/**
     * Add the frame sources to the GIF string (old: GIFAddFrames)
     * 
     * @param integer $i
     * @param integer $d
     */
	public function addGifFrames($i, $d)
    {
		$Locals_str = 13 + 3 * (2 << (ord($this->frameSources[ $i ] { 10 }) & 0x07));

		$Locals_end = strlen($this->frameSources[$i]) - $Locals_str - 1;
		$Locals_tmp = substr($this->frameSources[$i], $Locals_str, $Locals_end);

		$Global_len = 2 << (ord($this->frameSources[0 ] { 10 }) & 0x07);
		$Locals_len = 2 << (ord($this->frameSources[$i] { 10 }) & 0x07);

		$Global_rgb = substr($this->frameSources[0], 13, 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07)));
		$Locals_rgb = substr($this->frameSources[$i], 13, 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07)));

		$Locals_ext = "!\xF9\x04".chr(($this->dis << 2) | 1 + 0).chr(($d >> 0 ) & 0xFF).chr(($d >> 8) & 0xFF)."\x0\x0";

		if ($this->colour > -1 && ord($this->frameSources[$i] { 10 }) & 0x80) {
		  
			for ($j = 0; $j < (2 << (ord($this->frameSources[$i] { 10 } ) & 0x07)); $j++) {
			 
				if (ord($Locals_rgb { 3 * $j + 0 }) == (($this->colour >> 16) & 0xFF) &&
					ord($Locals_rgb { 3 * $j + 1 }) == (($this->colour >> 8) & 0xFF) &&
					ord($Locals_rgb { 3 * $j + 2 }) == (($this->colour >> 0) & 0xFF)
				) {
					$Locals_ext = "!\xF9\x04".chr(($this->dis << 2) + 1).chr(($d >> 0) & 0xFF).chr(($d >> 8) & 0xFF).chr($j)."\x0";
					break;
				}
			}
		}
        
		switch ($Locals_tmp { 0 }) {
		  
			case '!':
            
				$Locals_img = substr($Locals_tmp, 8, 10);
				$Locals_tmp = substr($Locals_tmp, 18, strlen($Locals_tmp) - 18);
                                
			break;
                
			case ',':
            
				$Locals_img = substr($Locals_tmp, 0, 10);
				$Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) - 10);
                                
			break;
		}
        
		if (ord($this->frameSources[$i] { 10 }) & 0x80 && $this->imgBuilt) {
		  
			if ($Global_len == $Locals_len) {
			 
				if ($this->gifBlockCompare($Global_rgb, $Locals_rgb, $Global_len)) {
				    
					$this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;
                    
				} else {
				    
					$byte = ord($Locals_img { 9 });
					$byte |= 0x80;
					$byte &= 0xF8;
					$byte |= (ord($this->frameSources[0] { 10 }) & 0x07);
					$Locals_img { 9 } = chr($byte);
					$this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;
				}
                
			} else {
			 
				$byte = ord($Locals_img { 9 });
				$byte |= 0x80;
				$byte &= 0xF8;
				$byte |= (ord($this->frameSources[$i] { 10 }) & 0x07);
				$Locals_img { 9 } = chr($byte);
				$this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;
			}
            
		} else {
		  
			$this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;
		}
        
		$this->imgBuilt = true;
	}
    
	/**
     * Add the gif string footer char (old: GIFAddFooter)
     */
	public function gifAddFooter()
    {
		$this->gif .= ';';
	}
    
	/**
     * Compare two block and return the version (old: GIFBlockCompare)
     * 
     * @param string $globalBlock
     * @param string $localBlock
     * @param integer $length
     * 
     * @return integer
	 */
	public function gifBlockCompare($globalBlock, $localBlock, $length)
    {
		for ($i = 0; $i < $length; $i++) {
		  
			if ($globalBlock { 3 * $i + 0 } != $localBlock { 3 * $i + 0 } ||
				$globalBlock { 3 * $i + 1 } != $localBlock { 3 * $i + 1 } ||
				$globalBlock { 3 * $i + 2 } != $localBlock { 3 * $i + 2 }) {
				
                return 0;
			}
		}

		return 1;
	}
    
	/**
     * Encode an ASCII char into a string char (old: GIFWord)
     * 
     * $param integer $char ASCII char
     * 
     * @return string
	 */
	public function encodeAsciiToChar($char)
    {
		return (chr($char & 0xFF).chr(($char >> 8) & 0xFF));
	}
    
    /**
     * Reset and clean the current object
     */
    public function reset()
    {
        $this->frameSources;
        $this->gif = 'GIF89a'; // the GIF header
        $this->imgBuilt = false;
        $this->loop = 0;
        $this->dis = 2;
        $this->colour = -1;
    }
    
    // Getter / Setter
    // ===================================================================================
    
	/**
     * Get the final GIF image string (old: GetAnimation)
     * 
     * @return string
	 */
	public function getGif()
    {
		return $this->gif;
	}
}
$base = ImageWorkshop::initFromPath($rootpath.'/learnecom/images/blank.png'); //tao anh trong
$base2 = ImageWorkshop::initFromPath($rootpath.'/learnecom/images/blank.png'); //tao anh trong (2)


$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/images/canh/2.png');
$base->addLayerOnTop($canh, 0, 10, "LB");


$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/equip/quanao/m/5.png');
$base->addLayerOnTop($canh, 0, 0, "LB");
$base2->addLayerOnTop($canh, 0, 0, "LB");
$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/equip/bieucam/m/3.png');
$base->addLayerOnTop($canh, 0, 0, "LB");
$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/equip/bieucam/m/3-2.png');
$base2->addLayerOnTop($canh, 0, 0, "LB");
$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/images/toc/1.png');
$base->addLayerOnTop($canh, 0, 0, "LB");
$base2->addLayerOnTop($canh, 0, 0, "LB");

$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/images/kinh/7.png');
$base->addLayerOnTop($canh, 0, 0, "LB");


$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/images/non/25.png');
$base->addLayerOnTop($canh, 0, 0, "LB");


$canh=ImageWorkshop::initFromPath($rootpath.'/learnecom/images/vukhi/2.png');
$base->addLayerOnTop($canh, 0, 0, "LB");

$desiredWidth = 120;
$desiredHeight = 150;
$image = $base->getResult();
$image2 = $base2->getResult();
$frames = array($image,$image2);
$durations = array(150, 50);
$gc = new GifCreator();
$gc->create($frames, $durations, 0);
$gifBinary = $gc->getGif();
header('Content-type: image/gif');
echo $gifBinary;
exit;
?>
Cảm ơn, nếu như sai box BQT nhắc nhở hộ ạ, thực sự mình đã loay hoay mãi mà k sao fix được :(
 

aviaiva

MasterCorporal
Tham gia
01/03/2016
Bài viết
335
Được Like
276
thêm một thuộc tính bakground:white vào sau khung đựng cái ảnh đó xem có được không
 

aviaiva

MasterCorporal
Tham gia
01/03/2016
Bài viết
335
Được Like
276
Mình cần background trong suốt cơ
background của cái ảnh thì nó vẫn trong suốt, nhưng khung đựng cái ảnh đó thì để background là white xem nó còn bị đen nữa không.
 

Careless

Private
Tham gia
19/06/2016
Bài viết
6
Được Like
1
background của cái ảnh thì nó vẫn trong suốt, nhưng khung đựng cái ảnh đó thì để background là white xem nó còn bị đen nữa không.
Mình làm được rồi nhưng bây giờ nó lại bị nhòe @@
Mã:
$image = $base->getResult();
$image2 = $base2->getResult();

ob_start();
$fill = imagecolorallocate($image, 255, 255, 255,127);
imagecolortransparent($image, $fill);
imagefill($image, 0, 0, $fill);
imagealphablending($image, false);
imagesavealpha($image, true);
imagegif($image);
$frames[]=ob_get_contents();
$framed[]=150; // Delay in the animation.
ob_end_clean();
ob_start();
$fill = imagecolorallocate($image2, 100,100,100, 127);
imagecolortransparent($image2, $fill);
imagefill($image2, 0, 0, $fill);
imagealphablending($image2, false);
imagesavealpha($image2, true);
imagegif($image2);
$frames[]=ob_get_contents();
$framed[]=50; // Delay in the animation.
ob_end_clean();

$gif = new GIFEncoder($frames,$framed,0,2,0,0,0,'bin');

header('Content-type: image/gif');
echo $gif->GetAnimation();
exit;
 

Đính kèm

  • macthu (1).gif
    macthu (1).gif
    8 KB · Lượt xem: 11

Top Bottom