我正在尝试从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
答案 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
中的更多内容