Commit 04e4b3bf072a3b6b682208e98f9f661638e3a372

Authored by Edmar Moretti
1 parent 6527d3d0

Ferramenta de Animacao no formato gif

admin/admin.db
No preview for this file type
ferramentas/animagif/exec.php 0 → 100755
... ... @@ -0,0 +1,192 @@
  1 +<?php
  2 +//$tema - nome do mapfile
  3 +//$colunat - coluna que contem os periodos
  4 +//$tempo - tempo entre os frames
  5 +//$w
  6 +//$h
  7 +//$cache
  8 +//$mapext
  9 +//http://localhost/i3geo/ferramentas/animagif/exec.php?tema=_llocali&colunat=ANOCRIA&w=500&h=500&mapext=-72%20-33%20-32%204
  10 +include("../../ms_configura.php");
  11 +include("../../classesphp/funcoes_gerais.php");
  12 +include("../../classesphp/pega_variaveis.php");
  13 +include("../../classesphp/carrega_ext.php");
  14 +$nometemp = nomeRandomico();
  15 +$arqtemp = $dir_tmp."/".$nometemp;
  16 +//
  17 +//carrega o phpmapscript
  18 +//
  19 +if (!function_exists('ms_GetVersion'))
  20 +{
  21 + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN'))
  22 + {
  23 + if(!@dl('php_mapscript_48.dll'))
  24 + dl('php_mapscript.dll');
  25 + }
  26 + else
  27 + {dl('php_mapscript.so');
  28 + }
  29 +}
  30 +$versao = versao();
  31 +$versao = $versao["principal"];
  32 +
  33 +//cria um mapa temporario
  34 +if($base == "" or !isset($base)){
  35 + $base = "";
  36 + if (strtoupper(substr(PHP_OS, 0, 3) == 'WIN')){
  37 + $base = $locaplic."/aplicmap/geral1windowsv".$versao.".map";
  38 + }
  39 + else{
  40 + if($base == "" && file_exists('/var/www/i3geo/aplicmap/geral1debianv'.$versao.'.map')){
  41 + $base = "/var/www/i3geo/aplicmap/geral1debianv".$versao.".map";
  42 + }
  43 + if($base == "" && file_exists('/var/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  44 + $base = "/var/www/html/i3geo/aplicmap/geral1fedorav".$versao.".map";
  45 + }
  46 + if($base == "" && file_exists('/opt/www/html/i3geo/aplicmap/geral1fedorav'.$versao.'.map')){
  47 + $base = "/opt/www/html/i3geo/aplicmap/geral1v".$versao.".map";
  48 + }
  49 + if($base == ""){
  50 + $base = $locaplic."/aplicmap/geral1v".$versao.".map";
  51 + }
  52 + }
  53 +}
  54 +else{
  55 + if(!file_exists($base)){
  56 + $base = $locaplic."/aplicmap/".$base;
  57 + }
  58 +}
  59 +$mapa = ms_newMapObj($base);
  60 +
  61 +//remove as camadas do mapa base
  62 +$numlayers = $mapa->numlayers;
  63 +for ($i=0;$i < $numlayers;$i++){
  64 + $layern = $mapa->getlayer($i);
  65 + if($layern->name != "copyright"){
  66 + $layern->set("status",MS_DELETE);
  67 + }
  68 + else{
  69 + $layern->set("status",MS_DEFAULT);
  70 + }
  71 +}
  72 +//ajusta o label
  73 +$l = $mapa->getlayerbyname("copyright");
  74 +$classe = $l->getclass(0);
  75 +$label = $classe->getLabel(0);
  76 +$label->updatefromstring("LABEL TYPE TRUETYPE END");
  77 +$label->set("font","arial");
  78 +$label->set("size",15);
  79 +$label->updatefromstring("LABEL POSITION lr END");
  80 +//$label->updatefromstring("LABEL OUTLINECOLOR 255 255 255 OUTLINEWIDTH 10 END");
  81 +//$labels = new styleObj($classe);
  82 +$label->updatefromstring('LABEL STYLE GEOMTRANSFORM "labelpoly" COLOR 255 255 255 END END');
  83 +//
  84 +$mapa->save($arqtemp.".map");
  85 +//adiciona ao mapa base as camadas do mapfile indicado em $tema
  86 +$nmapa = ms_newMapObj($locaplic."/temas/".$tema.".map");
  87 +$numlayers = $nmapa->numlayers;
  88 +for ($i=0;$i < $numlayers;$i++){
  89 + $layern = $nmapa->getlayer($i);
  90 + $layern->set("status",MS_DEFAULT);
  91 + if (!empty($postgis_mapa)){
  92 + if ($layern->connectiontype == MS_POSTGIS){
  93 + $lcon = $layern->connection;
  94 + error_reporting(0);
  95 + if (($lcon == " ") || ($lcon == "") || (in_array($lcon,array_keys($postgis_mapa)))){
  96 + if(($lcon == " ") || ($lcon == "")){
  97 + $layern->set("connection",$postgis_mapa);
  98 + }
  99 + else{
  100 + $layern->set("connection",$postgis_mapa[$lcon]);
  101 + }
  102 + }
  103 + }
  104 + }
  105 + autoClasses($layern,$nmapa);
  106 + cloneInlineSymbol($layern,$nmapa,$mapa);
  107 + ms_newLayerObj($mapa, $layern);
  108 +}
  109 +$mapa->save($arqtemp.".map");
  110 +//aplica a extensao geografica
  111 +$layer = $mapa->getlayerbyname($tema);
  112 +
  113 +$extatual = $mapa->extent;
  114 +$ret = "";
  115 +if(isset($mapext)){
  116 + $ret = str_replace(","," ",$mapext);
  117 +}
  118 +else{
  119 + $ret = $layer->getmetadata("extensao");
  120 +}
  121 +if ($ret != ""){
  122 + $ret = explode(" ",$ret);
  123 + $extatual->setextent($ret[0],$ret[1],$ret[2],$ret[3]);
  124 +}
  125 +$mapa->setsize($w,$h);
  126 +$sca = $mapa->scalebar;
  127 +$sca->set("status",MS_OFF);
  128 +$c = $mapa->imagecolor;
  129 +$c->setrgb(-1,-1,-1);
  130 +$o = $mapa->outputformat;
  131 +$o->set("imagemode",MS_IMAGEMODE_RGBA);
  132 +$o->set("transparent",MS_TRUE);
  133 +$mapa->save($arqtemp.".map");
  134 +$mapa = ms_newMapObj($arqtemp.".map");
  135 +if(validaAcessoTemas($arqtemp.".map",false) == true){
  136 + echo "Existem temas restritos";exit;
  137 +}
  138 +//pega a lista de valores unicos da $colunat
  139 +include_once("../../classesphp/classe_atributos.php");
  140 +$m = new Atributos($arqtemp.".map",$tema);
  141 +$lista = $m->listaRegistros($colunat,"mapa","sim",0,"","tudo","nao");
  142 +$lista = $lista[1]["registros"];
  143 +$listaunica = array();
  144 +foreach($lista as $l){
  145 + $v = $l["valores"][0]["valor"];
  146 + if($v != ""){
  147 + $listaunica[] = $v;
  148 + }
  149 +}
  150 +sort($listaunica);
  151 +//cria as imagens para cada periodo
  152 +$layer = $mapa->getlayerbyname($tema);
  153 +
  154 +$l = $mapa->getlayerbyname("copyright");
  155 +$c = $l->getclass(0);
  156 +$label = $c->getLabel(0);
  157 +
  158 +$imagens = array();
  159 +$duracao = array();
  160 +$objImagem = "";
  161 +//$listaunica = array($listaunica[1]);
  162 +foreach($listaunica as $d){
  163 + $filtro = "(([$colunat] = $d))";
  164 + $layer->setfilter($filtro);
  165 + $nomec = $arqtemp.$d.".png";
  166 +
  167 + $s = "LABEL TEXT '".$d."' END";
  168 + $label->updateFromString($s);
  169 +
  170 + if($objImagem == ""){
  171 + $objImagem = $mapa->draw();
  172 + $objImagem->saveImage($nomec);
  173 + }
  174 + else{
  175 + $i = $mapa->draw();
  176 + $objImagem->pasteImage($i,-1);
  177 + $objImagem->saveImage($nomec);
  178 + }
  179 + $imagens[] = $nomec;
  180 + $duracao[] = 40;
  181 +}
  182 +//junta as imagens no gif
  183 +include("../../pacotes/gifcreator/GifCreator.php");
  184 +$gc = new GifCreator();
  185 +$gc->create($imagens, $duracao, 1);
  186 +$gifBinary = $gc->getGif();
  187 +//retorna o gif para o navegador
  188 +header('Content-type: image/gif');
  189 +header('Content-Disposition: filename="butterfly.gif"');
  190 +echo $gifBinary;
  191 +exit;
  192 +?>
0 193 \ No newline at end of file
... ...
pacotes/gifcreator/GifCreator.php 0 → 100755
... ... @@ -0,0 +1,358 @@
  1 +<?php
  2 +
  3 +
  4 +
  5 +/**
  6 + * Create an animated GIF from multiple images
  7 + *
  8 + * @version 1.0
  9 + * @link https://github.com/Sybio/GifCreator
  10 + * @author Sybio (Clément Guillemain / @Sybio01)
  11 + * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  12 + * @copyright Clément Guillemain
  13 + */
  14 +class GifCreator
  15 +{
  16 + /**
  17 + * @var string The gif string source (old: this->GIF)
  18 + */
  19 + private $gif;
  20 +
  21 + /**
  22 + * @var string Encoder version (old: this->VER)
  23 + */
  24 + private $version;
  25 +
  26 + /**
  27 + * @var boolean Check the image is build or not (old: this->IMG)
  28 + */
  29 + private $imgBuilt;
  30 +
  31 + /**
  32 + * @var array Frames string sources (old: this->BUF)
  33 + */
  34 + private $frameSources;
  35 +
  36 + /**
  37 + * @var integer Gif loop (old: this->LOP)
  38 + */
  39 + private $loop;
  40 +
  41 + /**
  42 + * @var integer Gif dis (old: this->DIS)
  43 + */
  44 + private $dis;
  45 +
  46 + /**
  47 + * @var integer Gif color (old: this->COL)
  48 + */
  49 + private $colour;
  50 +
  51 + /**
  52 + * @var array (old: this->ERR)
  53 + */
  54 + private $errors;
  55 +
  56 + // Methods
  57 + // ===================================================================================
  58 +
  59 + /**
  60 + * Constructor
  61 + */
  62 + public function __construct()
  63 + {
  64 + $this->reset();
  65 +
  66 + // Static data
  67 + $this->version = 'GifCreator: Under development';
  68 + $this->errors = array(
  69 + 'ERR00' => 'Does not supported function for only one image.',
  70 + 'ERR01' => 'Source is not a GIF image.',
  71 + 'ERR02' => 'You have to give resource image variables, image URL or image binary sources in $frames array.',
  72 + 'ERR03' => 'Does not make animation from animated GIF source.',
  73 + );
  74 + }
  75 +
  76 + /**
  77 + * Create the GIF string (old: GIFEncoder)
  78 + *
  79 + * @param array $frames An array of frame: can be file paths, resource image variables, binary sources or image URLs
  80 + * @param array $durations An array containing the duration of each frame
  81 + * @param integer $loop Number of GIF loops before stopping animation (Set 0 to get an infinite loop)
  82 + *
  83 + * @return string The GIF string source
  84 + */
  85 + public function create($frames = array(), $durations = array(), $loop = 0)
  86 + {
  87 + if (!is_array($frames) && !is_array($GIF_tim)) {
  88 +
  89 + throw new \Exception($this->version.': '.$this->errors['ERR00']);
  90 + }
  91 +
  92 + $this->loop = ($loop > -1) ? $loop : 0;
  93 + $this->dis = 2;
  94 +
  95 + for ($i = 0; $i < count($frames); $i++) {
  96 +
  97 + if (is_resource($frames[$i])) { // Resource var
  98 +
  99 + $resourceImg = $frames[$i];
  100 +
  101 + ob_start();
  102 + imagegif($frames[$i]);
  103 + $this->frameSources[] = ob_get_contents();
  104 + ob_end_clean();
  105 +
  106 + } elseif (is_string($frames[$i])) { // File path or URL or Binary source code
  107 +
  108 + if (file_exists($frames[$i]) || filter_var($frames[$i], FILTER_VALIDATE_URL)) { // File path
  109 +
  110 + $frames[$i] = file_get_contents($frames[$i]);
  111 + }
  112 +
  113 + $resourceImg = imagecreatefromstring($frames[$i]);
  114 +
  115 + ob_start();
  116 + imagegif($resourceImg);
  117 + $this->frameSources[] = ob_get_contents();
  118 + ob_end_clean();
  119 +
  120 + } else { // Fail
  121 +
  122 + throw new \Exception($this->version.': '.$this->errors['ERR02'].' ('.$mode.')');
  123 + }
  124 +
  125 + if ($i == 0) {
  126 +
  127 + $colour = imagecolortransparent($resourceImg);
  128 + }
  129 +
  130 + if (substr($this->frameSources[$i], 0, 6) != 'GIF87a' && substr($this->frameSources[$i], 0, 6) != 'GIF89a') {
  131 +
  132 + throw new \Exception($this->version.': '.$i.' '.$this->errors['ERR01']);
  133 + }
  134 +
  135 + for ($j = (13 + 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07))), $k = TRUE; $k; $j++) {
  136 +
  137 + switch ($this->frameSources[$i] { $j }) {
  138 +
  139 + case '!':
  140 +
  141 + if ((substr($this->frameSources[$i], ($j + 3), 8)) == 'NETSCAPE') {
  142 +
  143 + throw new \Exception($this->version.': '.$this->errors['ERR03'].' ('.($i + 1).' source).');
  144 + }
  145 +
  146 + break;
  147 +
  148 + case ';':
  149 +
  150 + $k = false;
  151 + break;
  152 + }
  153 + }
  154 +
  155 + unset($resourceImg);
  156 + }
  157 +
  158 + if (isset($colour)) {
  159 +
  160 + $this->colour = $colour;
  161 +
  162 + } else {
  163 +
  164 + $red = $green = $blue = 0;
  165 + $this->colour = ($red > -1 && $green > -1 && $blue > -1) ? ($red | ($green << 8) | ($blue << 16)) : -1;
  166 + }
  167 +
  168 + $this->gifAddHeader();
  169 +
  170 + for ($i = 0; $i < count($this->frameSources); $i++) {
  171 +
  172 + $this->addGifFrames($i, $durations[$i]);
  173 + }
  174 +
  175 + $this->gifAddFooter();
  176 +
  177 + return $this->gif;
  178 + }
  179 +
  180 + // Internals
  181 + // ===================================================================================
  182 +
  183 + /**
  184 + * Add the header gif string in its source (old: GIFAddHeader)
  185 + */
  186 + public function gifAddHeader()
  187 + {
  188 + $cmap = 0;
  189 +
  190 + if (ord($this->frameSources[0] { 10 }) & 0x80) {
  191 +
  192 + $cmap = 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07));
  193 +
  194 + $this->gif .= substr($this->frameSources[0], 6, 7);
  195 + $this->gif .= substr($this->frameSources[0], 13, $cmap);
  196 + $this->gif .= "!\377\13NETSCAPE2.0\3\1".$this->encodeAsciiToChar($this->loop)."\0";
  197 + }
  198 + }
  199 +
  200 + /**
  201 + * Add the frame sources to the GIF string (old: GIFAddFrames)
  202 + *
  203 + * @param integer $i
  204 + * @param integer $d
  205 + */
  206 + public function addGifFrames($i, $d)
  207 + {
  208 + $Locals_str = 13 + 3 * (2 << (ord($this->frameSources[ $i ] { 10 }) & 0x07));
  209 +
  210 + $Locals_end = strlen($this->frameSources[$i]) - $Locals_str - 1;
  211 + $Locals_tmp = substr($this->frameSources[$i], $Locals_str, $Locals_end);
  212 +
  213 + $Global_len = 2 << (ord($this->frameSources[0 ] { 10 }) & 0x07);
  214 + $Locals_len = 2 << (ord($this->frameSources[$i] { 10 }) & 0x07);
  215 +
  216 + $Global_rgb = substr($this->frameSources[0], 13, 3 * (2 << (ord($this->frameSources[0] { 10 }) & 0x07)));
  217 + $Locals_rgb = substr($this->frameSources[$i], 13, 3 * (2 << (ord($this->frameSources[$i] { 10 }) & 0x07)));
  218 +
  219 + $Locals_ext = "!\xF9\x04".chr(($this->dis << 2) + 0).chr(($d >> 0 ) & 0xFF).chr(($d >> 8) & 0xFF)."\x0\x0";
  220 +
  221 + if ($this->colour > -1 && ord($this->frameSources[$i] { 10 }) & 0x80) {
  222 +
  223 + for ($j = 0; $j < (2 << (ord($this->frameSources[$i] { 10 } ) & 0x07)); $j++) {
  224 +
  225 + if (ord($Locals_rgb { 3 * $j + 0 }) == (($this->colour >> 16) & 0xFF) &&
  226 + ord($Locals_rgb { 3 * $j + 1 }) == (($this->colour >> 8) & 0xFF) &&
  227 + ord($Locals_rgb { 3 * $j + 2 }) == (($this->colour >> 0) & 0xFF)
  228 + ) {
  229 + $Locals_ext = "!\xF9\x04".chr(($this->dis << 2) + 1).chr(($d >> 0) & 0xFF).chr(($d >> 8) & 0xFF).chr($j)."\x0";
  230 + break;
  231 + }
  232 + }
  233 + }
  234 +
  235 + switch ($Locals_tmp { 0 }) {
  236 +
  237 + case '!':
  238 +
  239 + $Locals_img = substr($Locals_tmp, 8, 10);
  240 + $Locals_tmp = substr($Locals_tmp, 18, strlen($Locals_tmp) - 18);
  241 +
  242 + break;
  243 +
  244 + case ',':
  245 +
  246 + $Locals_img = substr($Locals_tmp, 0, 10);
  247 + $Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) - 10);
  248 +
  249 + break;
  250 + }
  251 +
  252 + if (ord($this->frameSources[$i] { 10 }) & 0x80 && $this->imgBuilt) {
  253 +
  254 + if ($Global_len == $Locals_len) {
  255 +
  256 + if ($this->gifBlockCompare($Global_rgb, $Locals_rgb, $Global_len)) {
  257 +
  258 + $this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;
  259 +
  260 + } else {
  261 +
  262 + $byte = ord($Locals_img { 9 });
  263 + $byte |= 0x80;
  264 + $byte &= 0xF8;
  265 + $byte |= (ord($this->frameSources[0] { 10 }) & 0x07);
  266 + $Locals_img { 9 } = chr($byte);
  267 + $this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;
  268 + }
  269 +
  270 + } else {
  271 +
  272 + $byte = ord($Locals_img { 9 });
  273 + $byte |= 0x80;
  274 + $byte &= 0xF8;
  275 + $byte |= (ord($this->frameSources[$i] { 10 }) & 0x07);
  276 + $Locals_img { 9 } = chr($byte);
  277 + $this->gif .= $Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp;
  278 + }
  279 +
  280 + } else {
  281 +
  282 + $this->gif .= $Locals_ext.$Locals_img.$Locals_tmp;
  283 + }
  284 +
  285 + $this->imgBuilt = true;
  286 + }
  287 +
  288 + /**
  289 + * Add the gif string footer char (old: GIFAddFooter)
  290 + */
  291 + public function gifAddFooter()
  292 + {
  293 + $this->gif .= ';';
  294 + }
  295 +
  296 + /**
  297 + * Compare two block and return the version (old: GIFBlockCompare)
  298 + *
  299 + * @param string $globalBlock
  300 + * @param string $localBlock
  301 + * @param integer $length
  302 + *
  303 + * @return integer
  304 + */
  305 + public function gifBlockCompare($globalBlock, $localBlock, $length)
  306 + {
  307 + for ($i = 0; $i < $length; $i++) {
  308 +
  309 + if ($globalBlock { 3 * $i + 0 } != $localBlock { 3 * $i + 0 } ||
  310 + $globalBlock { 3 * $i + 1 } != $localBlock { 3 * $i + 1 } ||
  311 + $globalBlock { 3 * $i + 2 } != $localBlock { 3 * $i + 2 }) {
  312 +
  313 + return 0;
  314 + }
  315 + }
  316 +
  317 + return 1;
  318 + }
  319 +
  320 + /**
  321 + * Encode an ASCII char into a string char (old: GIFWord)
  322 + *
  323 + * $param integer $char ASCII char
  324 + *
  325 + * @return string
  326 + */
  327 + public function encodeAsciiToChar($char)
  328 + {
  329 + return (chr($char & 0xFF).chr(($char >> 8) & 0xFF));
  330 + }
  331 +
  332 + /**
  333 + * Reset and clean the current object
  334 + */
  335 + public function reset()
  336 + {
  337 + $this->frameSources;
  338 + $this->gif = 'GIF89a'; // the GIF header
  339 + $this->imgBuilt = false;
  340 + $this->loop = 0;
  341 + $this->dis = 2;
  342 + $this->colour = -1;
  343 + }
  344 +
  345 + // Getter / Setter
  346 + // ===================================================================================
  347 +
  348 + /**
  349 + * Get the final GIF image string (old: GetAnimation)
  350 + *
  351 + * @return string
  352 + */
  353 + public function getGif()
  354 + {
  355 + return $this->gif;
  356 + }
  357 +}
  358 +?>
... ...
pacotes/gifcreator/README.md 0 → 100755
... ... @@ -0,0 +1,67 @@
  1 +# ================================
  2 +# GifCreator
  3 +# ================================
  4 +
  5 +GifCreator is a PHP class to create animated GIF from multiple images
  6 +
  7 +### For what ?
  8 +
  9 +This class helps you to create an animated GIF image: give multiple images and their duration and that's it !
  10 +
  11 +### Usage
  12 +
  13 +**1 - Creation:**
  14 +
  15 +```php
  16 +// Create an array containing file paths, resource var (initialized with imagecreatefromXXX),
  17 +// image URLs or even binary code from image files.
  18 +// All sorted in order to appear.
  19 +$frames = array(
  20 + imagecreatefrompng("/../images/pic1.png"), // Resource var
  21 + "/../images/pic2.png", // Image file path
  22 + file_get_contents("/../images/pic3.jpg"), // Binary source code
  23 + 'http://thisisafakedomain.com/images/pic4.jpg', // URL
  24 +);
  25 +
  26 +// Create an array containing the duration (in millisecond) of each frames (in order too)
  27 +$durations = array(40, 80, 40, 20);
  28 +
  29 +// Initialize and create the GIF !
  30 +$gc = new GifCreator();
  31 +$gc->create($frames, $durations, 5);
  32 +```
  33 +The 3rd parameter of create() method allows you to choose the number of loop of your animated gif before it stops.
  34 +In the previous example, I chose 5 loops. Set 0 (zero) to get an infinite loop.
  35 +
  36 +**2 - Get the result:**
  37 +
  38 +You can now get the animated GIF binary:
  39 +
  40 +```php
  41 +$gifBinary = $gc->getGif();
  42 +```
  43 +
  44 +Then you can show it in the navigator:
  45 +
  46 +```php
  47 +header('Content-type: image/gif');
  48 +header('Content-Disposition: filename="butterfly.gif"');
  49 +echo $gifBinary;
  50 +exit;
  51 +```
  52 +
  53 +Or save it in a folder as a GIF:
  54 +
  55 +```php
  56 +file_put_contents('/myfolder/animated_picture.gif', $gifBinary);
  57 +```
  58 +
  59 +### Behavior
  60 +
  61 +- The transparency is based on the first given frame. It will be saved only if you give multiple frames with same transparent background.
  62 +- The dimensions of the generated GIF are based on the first frame. If you need to resize your frames to get the same dimension, you can use
  63 +this class: https://github.com/Sybio/ImageWorkshop
  64 +
  65 +### About
  66 +
  67 +The class reuses some part of code of "GIFEncoder.class.php" by László Zsidi (thanks to him).
0 68 \ No newline at end of file
... ...