使用PHP从SWF中提取图像时保持PNG透明度

时间:2014-09-04 07:30:00

标签: php png flash transparency

我正在尝试从SWF中提取图像。以下代码有效,但在提取png图像时,背景变得不透明。任何帮助都会很棒;这就是我所拥有的:

class SWFextractImages {
private $swf;
private $jpegTables;
private $shipID;

public function doExtractImages($shipID, $b) {
    $this->shipID = $shipID;
    $this->swf = new SWF($b);
    $this->jpegTables = '';
    foreach ($this->swf->tags as $tag) {
        if($tag['type']==6){
            if($this->defineBits($tag)){
                continue;
            }
        }
    }
}

private function defineBits($tag) {
    $ret = $this->swf->parseTag($tag);
    $imageData = $ret['imageData'];
    if (strlen($this->jpegTables) > 0) {
        $imageData = substr($this->jpegTables, 0, -2) . substr($imageData, 2);
    }
    if($ret['characterId']==5){
        $filename = sprintf('images/'.$this->shipID.'.jpg', $ret['characterId']);
        file_put_contents($filename, $imageData);
        return true;
    }
    }

}

不确定这是否有帮助,但这也会从SWF文件中提取其他数据。 Here's the source code

1 个答案:

答案 0 :(得分:0)

函数defineBits仅适用于jpg图像

对于png试试这个:

private function defineBitsLossless($tag) {
$ret = $this->swf->parseTag($tag);

$bitmapFormat = $ret['bitmapFormat'];
$bitmapWidth = $ret['bitmapWidth'];
$bitmapHeight = $ret['bitmapHeight'];
$pixelData = $ret['pixelData'];

$img = imageCreateTrueColor($bitmapWidth, $bitmapHeight);

if ($bitmapFormat == 3) {
    $colorTable = $ret['colorTable'];

    // Construct the colormap
    $colors = array();
    $i = 0;
    $len = strlen($colorTable);
    while ($i < $len) {
    $red = ord($colorTable[$i++]);
    $green = ord($colorTable[$i++]);
    $blue = ord($colorTable[$i++]);
    $colors[] = imageColorAllocate($img, $red, $green, $blue);
    }

    $bytesPerRow = $this->alignTo4bytes($bitmapWidth * 1); // 1 byte per sample

    // Construct the image
    for ($row = 0; $row < $bitmapHeight; $row++) {
    $off = $bytesPerRow * $row;
    for ($col = 0; $col < $bitmapWidth; $col++) {
        $idx = ord($pixelData[$off++]);
        imageSetPixel($img, $col, $row, $colors[$idx]);
    }
    }
} else if ($bitmapFormat == 4) {
    $bytesPerRow = $this->alignTo4bytes($bitmapWidth * 2); // 2 bytes per sample

    // Construct the image
    for ($row = 0; $row < $bitmapHeight; $row++) {
    $off = $bytesPerRow * $row;
    for ($col = 0; $col < $bitmapWidth; $col++) {
        $lo = ord($pixelData[$off++]);
        $hi = ord($pixelData[$off++]);
        $rgb = $lo + $hi * 256;
        $red = ($rgb >> 10) & 0x1f; // 5 bits
        $green = ($rgb >> 5) & 0x1f; // 5 bits
        $blue = ($rgb) & 0x1f; // 5 bits
        $color = imageColorAllocate($img, $red, $green, $blue);
        imageSetPixel($img, $col, $row, $color);
    }
    }
} else if ($bitmapFormat == 5) {
    $bytesPerRow = $this->alignTo4bytes($bitmapWidth * 4); // 4 bytes per sample

    // Construct the image
    for ($row = 0; $row < $bitmapHeight; $row++) {
    $off = $bytesPerRow * $row;
    for ($col = 0; $col < $bitmapWidth; $col++) {
        $off++; // Reserved
        $red = ord($pixelData[$off++]);
        $green = ord($pixelData[$off++]);
        $blue = ord($pixelData[$off++]);
        $color = imageColorAllocate($img, $red, $green, $blue);
        imageSetPixel($img, $col, $row, $color);
    }
    }
}
imagePNG($img, sprintf('images/img_%d.png', $ret['characterId']));
imageDestroy($img);
}

您可以阅读更多内容,了解更多内容并使用here

中的更多内容