WirelessBR

WirelessBr é um site brasileiro, independente, sem vínculos com empresas ou organizações, sem finalidade  comercial,  feito por voluntários, para divulgação de tecnologia em telecomunicações 

ÁLBUM DE FOTOS EM WAP 1.2.1 e PHP

AUTOR : MARCELO YONAMINE   

Publicado em 22/Abril/2004

Nota do autor: O leitor deste tutorial deve ter uma noção de como criar páginas dinâmicas em PHP.


Introdução

Na primeira versão da tecnologia WAP, as telas dos terminais eram pequenas e monocromáticas.
Como a tecnologia não anda para trás, hoje temos celulares com telas maiores e coloridas e capacidade de tirar fotos e até reproduzir vídeos.

Antes de começar a escrever os códigos, vou citar algumas diferenças importantes do WML em relação ao HTML.

a) Todas as tags devem ser escritas em letras minúsculas com exceção da declaração !DOCTYPE
   Exemplo:
      errado    <P>texto</P>
      certo     <p>texto</p>


b) Os elementos (tags) devem estar convenientemente aninhados.
     Exemplo:
       errado    <p><a href="music.mid">music.mid</p></a>
       certo     <p><a href="music.mid">music.mid</a></p>


c) Os documentos devem ser bem formados.

Um documento diz-se bem formado quando está estruturado de acordo com as regras definidas nas recomendações para XML 1.0
Exemplo:
Abaixo está a estrutura básica de uma página WAP que possibilita ver imagens e fotos.

Código do programa "teste.wap": 

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd">
<wml>
<head>
<meta http-equiv="Cache-Control" content="must-revalidate"/>
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT"/>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="teste" title="wap page"><p>
<img src="logo.gif" alt="logo"/><br/>
<img src="photo.jpg" alt="photo"/><br/>
teste<br/>
<do type="prev" name="Prev" label="back">
<prev></prev>
</do>
</p></card>
</wml>


d) O uso de tags de fechamento é obrigatório.
    Exemplo:
       errado    <p>parágrafo 1 <p>parágrafo 2
       certo     <p>parágrafo 1</p><p>parágrafo 2</p>

e) Elementos vazios devem ser fechados.
    Exemplo:
       errado    <br> <img src="photo.jpg" alt="photo.jpg">
       certo     <br/> <img src="photo.jpg" alt="photo.jpg"/>


Wap e páginas dinâmicas em PHP

Uma página PHP tem a extensão .php, .phtml, etc.

Você pode mixar tags wml e código PHP em sua página dinâmica usando delimitadores:

<?PHP código PHP ?>

Precisamos fazer com que o navegador WAP reconheça uma página PHP como sendo uma página WAP.
Usando o cabeçalho Header:

<?PHP Header("Content-type: text/vnd.wap.wml"); ?>

Coloque o Header na primeira linha de sua página PHP.

Código do programa "teste.php":

<?PHP
Header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\"?>";
?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd">
<wml>
<head>
<meta http-equiv="Cache-Control" content="must-revalidate"/>
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT"/>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head>
<card id="teste" title="wap page"><p>
<img src="logo.gif" alt="logo"/><br/>
<img src="photo.jpg" alt="photo"/><br/>
teste<br/>
<do type="prev" name="Prev" label="back">
<prev></prev>
</do>
</p></card>
</wml>


Para testar é necessário um servidor web (PWS, Apache, IIS), PHP4 com suporte a biblioteca gráfica GD2, e um navegador wap.
Um dos mais simples e eficientes navegadores wap para teste é o Wapaka que é free.
Este navegador foi escrito em java, sendo necessário instalar primeiro o J2SE RE.

Álbum de fotos WAP

Até aqui foi mostrado o básico. 
Agora vamos editar um script em PHP que vai listar e identificar arquivos de fotos .jpg .png em um diretório. 
Este script deve mostrar as fotos em miniatura e contar as fotos de cinco em cinco por página wap dinâmica.

Na verdade o álbum virtual é dividido em dois scripts PHP: 
- Um que vai listar os arquivos de foto e fazer a paginação, 
- e outro script cuja função é gerar a miniatura da foto.

O primeiro script base é o "album.php"; abaixo, está o código:
<?PHP
Header("Content-type: text/vnd.wap.wml");
echo "<?xml version=\"1.0\"?>"; 
?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd">


<wml>
<head>
<meta http-equiv="Cache-Control" content="must-revalidate"/>
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT"/>
<meta http-equiv="Cache-Control" content="max-age=0"/>
</head> 

<card id="teste" title="photo album"><p>

<?
$imgthumb = "imgthumb.php"; #nome do script gerador de miniatura
$fileimage = "flist.txt"; #arquivo texto referência do array 
$arquivo = fopen("$fileimage", 'w+'); #abre o arquivo texto
$myfiledir = dirname(__FILE__); #diretório local
$handle=opendir($myfiledir); #abre o diretório local
while ($filet = readdir($handle))
{
if($filet=='.'||$filet=='..')
continue;
$filetl = strtolower($filet); #para minusculas
if (preg_match("/\.(jpeg|jpg|jpe|png)$/", $filetl)){ // filtro de extensão 
$filetlist [$filet] = filemtime ($filet); #ordena por data de atualização
}
}
if (empty($filetlist)) {} else {
arsort($filetlist); #este array somente aceita asort ou arsort 

while (list ($key, $val) = each ($filetlist))
{
$filesize = filesize("$myfiledir/$key");
fputs($arquivo, "$key|$filesize\n", 20000000); #grava o nome do arquivo e o tamanho

}
fclose($arquivo);
$arquivos = file("$fileimage"); #abre o arquivo txt e lista os elementos em um array
$count = count($arquivos); #número total dos elementos do array
echo "$count photo s<br/><br/>\n"; 
$nfotos = 5; #define a quantidade de fotos por página 
if (empty($max)) {
$max = $nfotos;
}
if (empty($min)) {
$min = 0;
}
if ($max > $count) {
$max = $count;
}
for ($i = $min; $i < $max; $i++) {
$imagename = $arquivos[$i]; 
$explode = explode("|", $imagename); #extrai os elementos dos campos do array
echo "<img src=\"$imgthumb?filename=$explode[0]\" alt=\"$explode[0]\"/><br/>\n"; 
echo "$explode[0]<br/>\n"; #mostra o nome do arquivo
echo "size $explode[1]<br/>\n"; #mostra o tamanho do arquivo
}
$maxp = $max + $nfotos; #próxima página
if ($max < $count) 
{
echo "<a href=\"album.php?min=$max & amp; max=$maxp\">next</a><br/>\n"; #link do paginador

?>
<do type="prev" name="Prev" label="back">
<prev></prev>
</do>
</p></card>
</wml>


Lembrando que no Servidor Linux é necessário o comando CHMOD 777, permissão de escrita de arquivos no diretório.

O  script abaixo é o gerador de miniaturas. 
Este script PHP lê o arquivo .jpg ou .png e redimensiona a imagem com os parâmetros de altura e largura.

Código do script "imgthumb.php" :

<?PHP
#Para rodar este script é necessário o PHP 4 e a biblioteca GD 2
##$thumb->save("teste.jpg"); // salva o arquivo miniatura função não usada

define(MAX_WIDTH, 96); #define a largura da foto miniatura 
define(MAX_HEIGHT, 65); #define a altura da foto miniatura

$mydir = dirname(__FILE__); #diretório local dos arquivos de foto

$image_file = "$mydir/$filename"; 

# Carrega a imagem 
$img = null; 

$extensao = strtolower(end(explode('.', $image_file))); 

if ($extensao == 'jpg' || $extensao == 'jpeg' || $extensao == 'jpe') {

$img = @imagecreatefromjpeg($image_file); 

} else if ($extensao == 'png') {

$img = @imagecreatefrompng($image_file); 

// Se a versão do GD incluir suporte a GIF, mostra... 
} else if ($extensao == 'gif') {

$img = @imagecreatefromgif($image_file); 


if ($img) { 

// Pega o tamanho da imagem e proporção de resize 
$width = imagesx($img); 
$height = imagesy($img); 
$scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

// Se a imagem é maior que o permitido, encolhe ela! 
if ($scale < 1) { 
$new_width = floor($scale*$width); 
$new_height = floor($scale*$height);
} else {
$new_width = MAX_WIDTH;
$new_height = MAX_HEIGHT;



if(!$img) {

$img = imagecreate(MAX_WIDTH, MAX_HEIGHT); #cria imagem de erro

imagecolorallocate($img,230,230,230); 

$c = imagecolorallocate($img,173,173,173); 
$c1 = imagecolorallocate($img,8,8,8); 

imagestring($img, 2, 12, 35, 'image error !',$c1 );
// Mostra a imagem 
header('Content-type: image/jpeg'); 
imagejpeg($img); 



$thumb=new thumbnail("$image_file"); // seta o nome do arquivo para redimensionar
$thumb->size_width($new_width); // seta largura para a miniatura, ou
$thumb->size_height($new_height); // seta altura para a miniatura
$thumb->size_auto($new_width); 
$thumb->show();

class thumbnail
{
var $img;

function thumbnail($imgfile)
{
//deteta formato da imagem
$this->img["format"]=ereg_replace(".*\.(.*)$","\\1",$imgfile);
$this->img["format"]=strtoupper($this->img["format"]);
if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {
//JPEG
$this->img["format"]="JPEG";
$this->img["src"] = ImageCreateFromJPEG ($imgfile);
} elseif ($this->img["format"]=="PNG") {
//PNG
$this->img["format"]="PNG";
$this->img["src"] = ImageCreateFromPNG ($imgfile);
} elseif ($this->img["format"]=="GIF") {
//GIF
$this->img["format"]="GIF";
$this->img["src"] = ImageCreateFromGIF ($imgfile);
} elseif ($this->img["format"]=="WBMP") {
//WBMP
$this->img["format"]="WBMP";
$this->img["src"] = ImageCreateFromWBMP ($imgfile);
} else {
//DEFAULT

exit();
}
@$this->img["lebar"] = imagesx($this->img["src"]);
@$this->img["tinggi"] = imagesy($this->img["src"]);
//default quality jpeg
$this->img["quality"]=75;
}

function size_height($size=100)
{
//height
$this->img["tinggi_thumb"]=$size;
@$this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];
}

function size_width($size=100)
{
//width
$this->img["lebar_thumb"]=$size;
@$this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];
}

function size_auto($size=100)
{
//size
if ($this->img["lebar"]>=$this->img["tinggi"]) {
$this->img["lebar_thumb"]=$size;
@$this->img["tinggi_thumb"] = ($this->img["lebar_thumb"]/$this->img["lebar"])*$this->img["tinggi"];
} else {
$this->img["tinggi_thumb"]=$size;
@$this->img["lebar_thumb"] = ($this->img["tinggi_thumb"]/$this->img["tinggi"])*$this->img["lebar"];
}
}

function jpeg_quality($quality=75)
{
//jpeg quality
$this->img["quality"]=$quality;
}

function show()
{
//mostra miniatura
@Header("Content-Type: image/".strtolower($this->img["format"])); #cabeçalho header mime type 

/* muda ImageCreateTrueColor para ImageCreate se a versão do GD não suporta função ImageCreateTrueColor */
$this->img["des"] = ImageCreateTrueColor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
@imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);

if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {
//JPEG
imageJPEG($this->img["des"],"",$this->img["quality"]);
} elseif ($this->img["format"]=="PNG") {
//PNG
imagePNG($this->img["des"]);
} elseif ($this->img["format"]=="GIF") {
//GIF
imageGIF($this->img["des"]);
} elseif ($this->img["format"]=="WBMP") {
//WBMP
imageWBMP($this->img["des"]);
}
}

function save($save="")
{
//salva a miniatura no diretório
if (empty($save)) $save=strtolower("./thumb.".$this->img["format"]);
/* muda ImageCreateTrueColor para ImageCreate se a versão do GD não suporta função ImageCreateTrueColor*/
$this->img["des"] = ImageCreateTrueColor($this->img["lebar_thumb"],$this->img["tinggi_thumb"]);
@imagecopyresized ($this->img["des"], $this->img["src"], 0, 0, 0, 0, $this->img["lebar_thumb"], $this->img["tinggi_thumb"], $this->img["lebar"], $this->img["tinggi"]);

if ($this->img["format"]=="JPG" || $this->img["format"]=="JPEG") {
//JPEG
imageJPEG($this->img["des"],"$save",$this->img["quality"]);
} elseif ($this->img["format"]=="PNG") {
//PNG
imagePNG($this->img["des"],"$save");
} elseif ($this->img["format"]=="GIF") {
//GIF
imageGIF($this->img["des"],"$save");
} elseif ($this->img["format"]=="WBMP") {
//WBMP
imageWBMP($this->img["des"],"$save");
}
}
}

?>


Conclusão

Este é o fim deste tutorial. 
Tentamos mostrar o básico de um sistema de álbum de fotos para celulares com acesso a WAP 1.2.1
Um desenvolvedor com conhecimento da tecnologia PHP e WAP poderia incluir ao álbum virtual suporte a Mensagens MMS, como a empresa MMS2WEB, por exemplo.

Espero que tenham gostado deste tutorial
Abraços
Marcelo Yonamine
ci555@zipmail.com.br
 

 

Home WirelessBR