<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TechTips &#187; Desenvolvimento Web</title>
	<atom:link href="http://www.techtips.com.br/category/desenvolvimento-web/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.techtips.com.br</link>
	<description>Dicas de Tecnologia</description>
	<lastBuildDate>Wed, 24 Jun 2009 19:06:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Safari: Uma nova alternativa para navegar em Windows</title>
		<link>http://www.techtips.com.br/desenvolvimento-web/safari-uma-nova-alternativa-para-navegar-em-windows/</link>
		<comments>http://www.techtips.com.br/desenvolvimento-web/safari-uma-nova-alternativa-para-navegar-em-windows/#comments</comments>
		<pubDate>Mon, 11 Jun 2007 20:56:56 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/desenvolvimento-web/safari-uma-nova-alternativa-para-navegar-em-windows/</guid>
		<description><![CDATA[A Apple acaba de lançar o Safari, seu browser padrão do MacOS X, para a plataforma Windows. O download da versão beta já está disponível: É mais uma alternativa na escolha de browsers, principalmente considerando os impressionantes números de performance promovidos na página do produto: renderização de páginas 2 vezes mais rápida do que no [...]]]></description>
			<content:encoded><![CDATA[<p>A Apple acaba de lançar o <a href="http://www.apple.com/safari/">Safari</a>, seu browser padrão do MacOS X, para a plataforma Windows. O download da versão beta <a href="http://www.apple.com/safari/download/">já está disponível</a>:</p>
<p><a href="http://www.techtips.com.br/wp-content/uploads/SafariUmanovaalternativaparanavegaremWin_F7B8/techtipssafari4.png"><img height="336" src="http://www.techtips.com.br/wp-content/uploads/SafariUmanovaalternativaparanavegaremWin_F7B8/techtipssafari_thumb2.png" width="640" border="0"></a> </p>
<p>É mais uma alternativa na escolha de browsers, principalmente considerando os impressionantes números de performance promovidos na página do produto: renderização de páginas 2 vezes mais rápida do que no IE7, e 1.6 vezes mais rápida do que no FireFox, além de execução de JavaScript 2.8 vezes mais rápida do que no IE7, e os mesmos 1.6 mais rápidos que o FireFox. Resta ver se essa performance se prova na prática.</p>
<p>Talvez mais importante que isso, é a possibilidade de web designers que utilizam Windows poderem testar suas páginas no Safari mesmo sem ter acesso a um Mac. Até agora, a única alternativa seria utilizar um site como o <a href="http://www.danvine.com/icapture/">iCapture</a>, que captura um screenshot do seu site pelo Safari rodando no OS X. Aliás, se o iCapture despertou o seu interesse, não deixe de conhecer o <a href="http://www.ipinfo.info/netrenderer/">netrenderer</a>, que faz a mesma coisa utilizando diversas versões do Internet Explorer, e o <a href="http://browsershots.org/">BrowserShots</a>, que cobre uma diversa gama de browsers no Mac, Linux e Windows.</p>
<p>Já estou experimentando o Safari, mas estou sentindo falta das extensions que uso no FireFox. Tenho a impressão que os <a href="https://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/">nightly builds</a> do Firefox 3.0 ainda serão o meu browser padrão por algum tempo.</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/desenvolvimento-web/safari-uma-nova-alternativa-para-navegar-em-windows/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Jash &#8211; JavaScript Shell &#8211; Um Prompt Interativo Dentro do Browser</title>
		<link>http://www.techtips.com.br/desenvolvimento-web/jash-javascript-shell-um-prompt-interativo-dentro-do-browser/</link>
		<comments>http://www.techtips.com.br/desenvolvimento-web/jash-javascript-shell-um-prompt-interativo-dentro-do-browser/#comments</comments>
		<pubDate>Sun, 20 May 2007 18:52:57 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/desenvolvimento-web/jash-javascript-shell-um-prompt-interativo-dentro-do-browser/</guid>
		<description><![CDATA[Seguindo no assunto de desenvolvimento de aplicações Web com JavaScript, vou apresentar uma ferramenta interessante para trabalhar com JavaScript: o Jash, ou JavaScript shell, um prompt interativo que permite você executar comandos e testar código JavaScript diretamente dentro do browser. Ele funciona abrindo uma janela DHTML dentro de qualquer página que você estiver navegando, permitindo [...]]]></description>
			<content:encoded><![CDATA[<p>Seguindo no assunto de desenvolvimento de aplicações Web com JavaScript, vou apresentar uma ferramenta interessante para trabalhar com JavaScript: o <a href="http://www.billyreisinger.com/jash/">Jash</a>, ou JavaScript shell, um prompt interativo que permite você executar comandos e testar código JavaScript diretamente dentro do browser.</p>
<p>Ele funciona abrindo uma janela DHTML dentro de qualquer página que você estiver navegando, permitindo você interagir com o código JavaScript existente nessa página, com a própria página, ou digitar comandos independentes.</p>
<p>Você pode fazer o <a href="http://www.billyreisinger.com/jash/download.html">download</a> diretamente do site oficial da ferramenta. Para usar, basta atualizar os caminhos dentro do arquivo .js para o local que ele foi salvo, adicionar uma referência na página que você está desenvolvendo, ou mais fácil ainda, criar um <a href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://www.billyreisinger.com/jash/source/latest/Jash.js';})();">bookmarklet</a> apontando para ele.</p>
<p>Vá em frente, clique no link acima e veja o Jash funcionando diretamente aqui. Ele completa nomes de objetos, propriedades e funções com a tecla Tab, além de ter vários recursos interessantes para ajudar a desenvolver sua aplicação web. Bem útil.</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/desenvolvimento-web/jash-javascript-shell-um-prompt-interativo-dentro-do-browser/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tutorial: Instalando o SDK do Qooxdoo para criar aplica&#231;&#245;es AJAX</title>
		<link>http://www.techtips.com.br/desenvolvimento-web/tutorial-instalando-o-sdk-do-qooxdoo-para-criar-aplicaes-ajax/</link>
		<comments>http://www.techtips.com.br/desenvolvimento-web/tutorial-instalando-o-sdk-do-qooxdoo-para-criar-aplicaes-ajax/#comments</comments>
		<pubDate>Wed, 16 May 2007 19:00:53 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/desenvolvimento-web/tutorial-instalando-o-sdk-do-qooxdoo-para-criar-aplicaes-ajax/</guid>
		<description><![CDATA[Já apresentei o Qooxdoo, uma biblioteca de interface visual escrita em JavaScript, com a finalidade de criar interfaces web ricas em aplicações AJAX. Se trabalhar com o Qooxdoo te interessou, aqui seguem os passos necessários para a instalação do SDK em plataforma windows, para poder desenvolver e depurar suas aplicações AJAX utilizando todos os recursos [...]]]></description>
			<content:encoded><![CDATA[<p>Já <a href="http://www.techtips.com.br/desenvolvimento-web/ajax/clientes-ricos-ajax-na-web-com-qooxdoo/">apresentei o Qooxdoo</a>, uma biblioteca de interface visual escrita em JavaScript, com a finalidade de criar interfaces web ricas em aplicações AJAX. Se trabalhar com o Qooxdoo te interessou, aqui seguem os passos necessários para a instalação do SDK em plataforma windows, para poder desenvolver e depurar suas aplicações AJAX utilizando todos os recursos do Qooxdoo.</p>
<h2>Pré-requisitos</h2>
<p>O Qooxdoo utiliza uma espécie de compilação para gerar os arquivos de JavaScript para desenvolvimento e depuração ou para o deployment final (com otimizações extras). Isso é feito utilizando o make da GNU, disponível no windows através do <a href="http://www.cygwin.com/">cygwin</a>. Baixe então <a href="http://www.cygwin.com/setup.exe">o instalador web do cygwin</a>. Rode a instalação e prossiga escolhendo um mirror qualquer, uma pasta de instalação qualquer, até chegar na seleção de pacotes. Não aceite os valores padrão &#8211; para desenvolver aplicações Qooxdoo, além dos pacotes padrão,&nbsp;você vai precisar selecionar os seguintes pacotes:</p>
<ul>
<li>Archive
<ul>
<li>zip
<li>unzip</li>
</ul>
<li>Devel
<ul>
<li>make
<li>gettext
<li>gettext-devel</li>
</ul>
<li>Interpreters
<ul>
<li>python</li>
</ul>
<li>Net
<ul>
<li>rsync</li>
</ul>
<li>Web
<ul>
<li>wget</li>
</ul>
</li>
</ul>
<p>&nbsp;Para selecionar um pacote, clique sobre o texto &#8220;skip&#8221; ao lado dele para instalar a versão mais recente disponível.</p>
<h2>Qooxdoo SDK</h2>
<p>Após concluir a instalação do cygwin com sucesso, baixe o <a href="http://qooxdoo.org/download#sdk">SDK do Qooxdoo</a>. A versão mais recente, enquanto escrevo isto, é a <a href="http://downloads.sourceforge.net/qooxdoo/qooxdoo-0.6.6-sdk.tar.gz">0.6.6</a>. Basta descompactar o arquivo em alguma pasta.</p>
<p>Abrindo um prompt do cygwin (um shell bash, para quem está acostumado com ele no Linux), vá até a pasta que você descompactou o SDK. Geralmente, no cygwin, suas partições de dados do windows vão estar em /cydrive/unidade. No prompt do Cygwin, digite algo parecido com isso, portanto:</p>
<pre>$ cd /cygdrive/c/projetos/qooxdoo-0.6.6-sdk/frontend/
$ make</pre>
<p>&nbsp;Se tudo correu bem com a instalação até aqui, ele deve fazer a geração dos arquivos JavaScript contendo o código fonte do Qooxdoo. Para testar, você já pode abrir o arquivo frontend/application/index.html em um browser e testar os exemplos que vem com ele.</p>
<h2>A primeira aplicação</h2>
<p>Se você gerou os arquivos com sucesso, o próximo passo é criar a sua primeira aplicação com o Qooxdoo (ou a segunda, se você acompanhou <a href="http://www.techtips.com.br/desenvolvimento-web/ajax/clientes-ricos-ajax-na-web-com-qooxdoo/">o primeiro artigo</a> e já usou a versão quickstart).</p>
<p>A maneira mais fácil de iniciar uma nova aplicação vazia com o Qooxdoo é usando o esqueleto de uma aplicação vazia que vem com ele. Você vai encontrar esse esqueleto na pasta frontend/application da SDK, compactado em um arquivo .tar.gz. Descompacte esse arquivo para uma pasta qualquer (no meu caso, vou descompactar na mesma pasta onde descompactei a SDK, c:\projetos- você vai ter que arrumar os caminhos relativos nas configurações abaixo se colocar em uma pasta diferente). Renomeie a pasta para ter o nome do seu projeto.</p>
<p>O próximo passo é configurar o makefile, que vai estar dentro dessa pasta. Abra o makefile em um editor de texto e preencha os valores das variáveis QOOXDOO_PATH e QOOXDOO_URI. No meu caso, ficou assim:</p>
<pre>QOOXDOO_PATH = ../qooxdoo-0.6.6-sdk
QOOXDOO_URI = ../../qooxdoo-0.6.6-sdk</pre>
<p>&nbsp;Neste ponto já podemos gerar nossa aplicação &#8211; basta navegar até essa pasta pelo prompt do cygwin e rodar o make.&nbsp; Se tudo correu bem, você pode abrir o arquivo source/index.html no seu browser e ver (novamente) o hello world.</p>
<p>Agora basta editar o arquivo source/class/custom/Application.js colocando o código que você quiser. A partir desse ponto, não precisa mais rodar o make a cada alteração &#8211; basta salvar e recarregar a página no seu browser.</p>
<p>Espero que tenha conseguido instalar o Qooxdoo &#8211; nos próximos artigos, como depurar o JavaScript (seu e do Qooxdoo), e como gerar e distribuir sua aplicação AJAX.</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/desenvolvimento-web/tutorial-instalando-o-sdk-do-qooxdoo-para-criar-aplicaes-ajax/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando um Redimensionador de Imagens em PHP</title>
		<link>http://www.techtips.com.br/programacao/orientacao-a-objetos/criando-um-redimensionador-de-imagens/</link>
		<comments>http://www.techtips.com.br/programacao/orientacao-a-objetos/criando-um-redimensionador-de-imagens/#comments</comments>
		<pubDate>Tue, 15 May 2007 20:19:56 +0000</pubDate>
		<dc:creator>Cesar</dc:creator>
				<category><![CDATA[Desenvolvimento Web]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/semcategoria/criando-um-redimensionador-de-imagens/</guid>
		<description><![CDATA[Muitos sites hoje vistos pela web tem algum álbum de fotos ou algo parecido neles, então neste artigo veremos como fazer um redimensionador de imagens em PHP para que possa ser utilizado para padronizar o tamanho das imagens postadas no mesmo, inclusive podendo colocar uma &#8220;marca d&#8217;agua&#8221; nas imagens para os casos específicos e até [...]]]></description>
			<content:encoded><![CDATA[<p>Muitos sites hoje vistos pela web tem algum álbum de fotos ou algo parecido neles, então neste artigo veremos como fazer um redimensionador de imagens em PHP para que possa ser utilizado para padronizar o tamanho das imagens postadas no mesmo, inclusive podendo colocar uma &#8220;marca d&#8217;agua&#8221; nas imagens para os casos específicos e até rotacioná-las.</p>
<p>Vale lembrar que o PHP, ou melhor, a biblioteca de tratamento de imagens do PHP chamada de GD2, não é e não tem o objetivo de ser um &#8220;Photoshop&#8221;, mas supre as necessidades básicas para o tratamento de imagens para WEB. Devemos também saber que o resultado do uso desta biblioteca depende muito da imagem que será tratada, e que aumentar uma imagem através da biblioteca pode fazer com que perca significadamente sua qualidade.</p>
<p>Muito bem, para começarmos precisamos que a biblioteca GD2 do PHP esteja &#8220;descomentada&#8221; no arquivo PHP.INI no caso de usuários Windows, para usuários Linux será necessário recompilar o PHP com a biblioteca.</p>
<p>Com a GD2 habilitada, vamos a classe que será responsável pelo redimensionamento de imagens:</p>
<p><font size="2" face="Courier New">&lt;?php<br />
/**<br />
 * Classe para redimensionamento de imagens com opções para rotacionar e adicionar marca d&#8217;agua.<br />
 * <br />
 * @author Cesar Rodrigo Bagatoli -&gt; e-mail: crbdigo@gmail.com<br />
 * @version 1.0 em 15/05/2007.<br />
 *<br />
 */<br />
class Resize {<br />
    /**<br />
     * Nome da imagem com seu caminho completo, dentro do servidor.<br />
     *<br />
     * @var string<br />
     */<br />
    protected $image;</font><font size="2" face="Courier New">    /**<br />
     * Tipo da Imagem setado automaticamente (1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP,<br />
     * 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC,<br />
     * 14 = IFF, 15 = WBMP, 16 = XBM).<br />
     * Somente serão aceitos os tipos 1, 2 e 3.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $imageType;</font><font size="2" face="Courier New">    /**<br />
     * Tamanho vertical da imagem original.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $height;</font><font size="2" face="Courier New">    /**<br />
     * Tamanho horizontal da imagem original.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $width;</p>
<p>    /**<br />
     * Nome da imagem com seu caminho completo no servidor que será feita uma cópia da original, para preservar a original.<br />
     *<br />
     * @var string<br />
     */<br />
    protected $newImage;<br />
    <br />
    /**<br />
     * Novo tamanho vertical da imagem.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $newHeight;</p>
<p>    /**<br />
     * Novo tamanho horizontal da imagem.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $newWidth;</p>
<p>    /**<br />
     * Nome da imagem com seu caminho completo no servidor que será utilizada como marca d&#8217;água.<br />
     *<br />
     * @var string<br />
     */<br />
    protected $waterMarkImage;<br />
    <br />
    /**<br />
     * Tipo da imagem da marca d&#8217;agua setado automaticamente (1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP,<br />
     * 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC,<br />
     * 14 = IFF, 15 = WBMP, 16 = XBM).<br />
     * Somente serão aceitos os tipos 1, 2 e 3.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $waterMarkImageType;<br />
    <br />
    /**<br />
     * Tamanho vertical da marca d&#8217;agua.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $waterMarkImageHeight;<br />
    <br />
    /**<br />
     * Tamanho horizontal da marca d&#8217;agua.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $waterMarkImageWidth;<br />
    <br />
    /**<br />
     * Posição onde a marca d&#8217;agua será colocada.<br />
     * Valores poderão ser &#8217;topLeft&#8217;, &#8217;topCenter&#8217;, &#8217;topRight&#8217;, &#8217;bottomLeft&#8217;, &#8217;bottomCenter&#8217;, &#8217;bottomRight&#8217; ou &#8217;center&#8217;.<br />
     *<br />
     * @var string<br />
     */<br />
    protected $waterMarkPosition = &#8217;bottomRight&#8217;;<br />
    <br />
    /**<br />
     * Opacidade da marca d&#8217;agua.<br />
     * Valores de 0 a 100.<br />
     *<br />
     * @var integer<br />
     */<br />
    protected $waterMarkOpacity = 50;<br />
    <br />
    /**<br />
     * 1 para redimensionar proporcionalmente a imagem, 0 para permitir distorção.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $proportional = 1;</p>
<p>    /**<br />
     * H para redimensinar proporcionalmente a imagem com base na Horizontal, e V para redimensionar<br />
     * proporcionalmente a imagem com base na Vertical.<br />
     *<br />
     * @var string<br />
     */<br />
    protected $proportionalFlag = &#8217;H';</p>
<p>    /**<br />
     * Numero de graus em que a imagem deverá ser rotacionada.<br />
     * Valor de -360 a 360.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $degrees = 0;</p>
<p>    /**<br />
     * Cor da zona descoberta da imagem após a rotação.<br />
     *<br />
     * @var int<br />
     */<br />
    protected $bgColor = 0;</p>
<p>    /**<br />
     * Construtor<br />
     *<br />
     * @param string $image<br />
     * @access public<br />
     * @return boolean<br />
     */<br />
    public function Resize($image) {<br />
        $this-&gt;setImage($image);</p>
<p>        return true;<br />
    }</p>
<p>    /**<br />
     * Seta uma nova imagem para ser tratada e pega as dimensões dela junto com seu tipo.<br />
     *<br />
     * @param string $image<br />
     * @access public<br />
     */<br />
    public function setImage($image) {<br />
        $this-&gt;image = $image;</p>
<p>        try {<br />
            $tmp = getimagesize($this-&gt;image);<br />
            $this-&gt;width  = $tmp[0];<br />
            $this-&gt;height  = $tmp[1];<br />
            $this-&gt;imageType = $tmp[2];<br />
        }<br />
        catch (Exception $e) {<br />
            throw new Exception(&#8220;Não foi possível identificar o tamanho da imagem original.&#8221;);<br />
        }<br />
    }</p>
<p>    /**<br />
     * Retorna o caminho e nome da imagem atual.<br />
     *<br />
     * @return string<br />
     * @access public<br />
     */<br />
    public function getImage() {<br />
        return $this-&gt;image;<br />
    }</p>
<p>    /**<br />
     * Seta uma imagem para ser criada como cópia da original.<br />
     *<br />
     * @param string $newImage<br />
     * @access public<br />
     */<br />
    public function setNewImage($newImage) {<br />
        $this-&gt;newImage = $newImage;<br />
    }</p>
<p>    /**<br />
     * Retorna o caminho e nome da imagem cópia.<br />
     *<br />
     * @return string<br />
     * @access public<br />
     */<br />
    public function getNewImage() {<br />
        return $this-&gt;newImage;<br />
    }<br />
    <br />
    /**<br />
     * Seta uma imagem para ser utilizada como marca d&#8217;água.<br />
     *<br />
     * @param string $waterMarkImage<br />
     * @access public<br />
     */<br />
    public function setWaterMarkImage($waterMarkImage) {<br />
        $this-&gt;waterMarkImage = $waterMarkImage;<br />
    }<br />
    <br />
    /**<br />
     * Retorna o caminho e nome da imagem para marca d&#8217;água.<br />
     *<br />
     * @return string<br />
     * @access public<br />
     */<br />
    public function getWaterMarkImage() {<br />
        return $this-&gt;waterMarkImage;<br />
    }<br />
    <br />
    /**<br />
     * Seta a posição em que a marca d&#8217;agua aparecerá na imagem.<br />
     *<br />
     * @param string $waterMarkPosition<br />
     * @access public<br />
     */<br />
    public function setWaterMarkPosition($waterMarkPosition) {<br />
        if($waterMarkPosition == &#8217;topLeft&#8217; || <br />
           $waterMarkPosition == &#8217;topCenter&#8217; || <br />
           $waterMarkPosition == &#8217;topRight&#8217; || <br />
           $waterMarkPosition == &#8217;bottomLeft&#8217; || <br />
           $waterMarkPosition == &#8217;bottomCenter&#8217; || <br />
           $waterMarkPosition == &#8217;bottomRight&#8217; || <br />
           $waterMarkPosition == &#8217;center&#8217;) {<br />
            $this-&gt;waterMarkPosition = $waterMarkPosition;<br />
        }<br />
        else {<br />
            throw new Exception(&#8220;Posição da marca d&#8217;agua é inválida.&#8221;);<br />
        }<br />
    }<br />
    <br />
    /**<br />
     * Retorna a posição em que a marca d&#8217;agua deve ser colocada.<br />
     *<br />
     * @return string<br />
     * @access public<br />
     */<br />
    public function getWaterMarkPosition() {<br />
        return $this-&gt;waterMarkPosition;<br />
    }<br />
    <br />
    /**<br />
     * Seta a opacidade da marca d&#8217;agua.<br />
     * Valores de 0 a 100.<br />
     *<br />
     * @param int $waterMarkOpacity<br />
     * @access public<br />
     */<br />
    public function setWaterMarkOpacity($waterMarkOpacity) {<br />
        if($waterMarkOpacity &gt;= 0 &amp;&amp; $waterMarkOpacity &lt;= 100) {<br />
            $this-&gt;waterMarkOpacity = $waterMarkOpacity;<br />
        }<br />
        else {<br />
            throw new Exception(&#8220;Opacidade informada é inválida. Use valores de 0 a 100.&#8221;);<br />
        }<br />
    }<br />
    <br />
    /**<br />
     * Retorna a opacidade que a marca d&#8217;agua deverá ter.<br />
     *<br />
     * @return int<br />
     * @access public<br />
     */<br />
    public function getWaterMarkOpacity() {<br />
        return $this-&gt;waterMarkOpacity;<br />
    }</p>
<p>    /**<br />
     * Seta o tamanho para o qual a imagem (original ou cópia) será redimensionada.<br />
     *<br />
     * @param int $newHeight<br />
     * @param int $newWidth<br />
     * @access public<br />
     */<br />
    public function setNewSize($newHeight, $newWidth) {<br />
        $this-&gt;newHeight = $newHeight;<br />
        $this-&gt;newWidth = $newWidth;<br />
    }</p>
<p>    /**<br />
     * 1 para redimensionar proporcionalmente a imagem, 0 para permitir distorção.<br />
     *<br />
     * @param int $proportional<br />
     * @access public<br />
     */<br />
    public function setProportional($proportional) {<br />
        $this-&gt;proportional = $proportional;<br />
    }</p>
<p>    /**<br />
     * Retorna se é para ser proporcional ou não.<br />
     *<br />
     * @return integer<br />
     * @access public<br />
     */<br />
    public function getProportional() {<br />
        return $this-&gt;proportional;<br />
    }</p>
<p>    /**<br />
     * H para redimensinar proporcionalmente a imagem com base na Horizontal, e V para redimensionar<br />
     * proporcionalmente a imagem com base na Vertical.<br />
     *<br />
     * @param string $proportionalFlag<br />
     * @access public<br />
     */<br />
    public function setProportionalFlag($proportionalFlag) {<br />
        $this-&gt;proportionalFlag = $proportionalFlag;<br />
    }</p>
<p>    /**<br />
     * Retorna a base pela qual será mantida a proporção de redimensionamento.<br />
     *<br />
     * @return string<br />
     * @access public<br />
     */<br />
    public function getProportionalFlag() {<br />
        return $this-&gt;proportionalFlag;<br />
    }<br />
    <br />
    /**<br />
     * Seta quantos graus em que a imagem deverá ser rotacionada.<br />
     * Valor de -360 a 360.<br />
     *<br />
     * @param int $degrees<br />
     * @access public<br />
     */<br />
    public function setDegrees($degrees) {<br />
        if($degrees &gt; 360 || $degrees &lt; -360) {<br />
            throw new Exception(&#8220;Ângulo informado incorreto. Valor aceito é de -360 a 360.&#8221;);<br />
        }<br />
        $this-&gt;degrees = $degrees;<br />
    }<br />
    <br />
    /**<br />
     * Retorna o numero de graus em que a imagem deverá ser rotacionada.<br />
     *<br />
     * @return int<br />
     * @access public<br />
     */<br />
    public function getDegrees() {<br />
        return $this-&gt;degrees;<br />
    }<br />
    <br />
    /**<br />
     * Seta a cor de fundo que a zona descoberta da imagem, depois de rotacionada, deverá ter.<br />
     *<br />
     * @param int $bgColor<br />
     * @access public<br />
     */<br />
    public function setBgColor($bgColor) {<br />
        $this-&gt;bgColor = $bgColor;<br />
    }<br />
    <br />
    /**<br />
     * Retorna a cor de fundo que a zona descoberta da imagem, depois de rotacionada, deverá ter.<br />
     *<br />
     * @return int<br />
     * @access public<br />
     */<br />
    public function getBgColor() {<br />
        return $this-&gt;bgColor;<br />
    }</p>
<p>    /**<br />
     * Faz uma cópia da imagem original e seta ela como $image para ser utilizada preservando a original.<br />
     *<br />
     * @return boolean<br />
     * @access private<br />
     * @uses setImage()<br />
     * @uses getImage()<br />
     * @uses setNewImage()<br />
     * @uses getNewImage()<br />
     */<br />
    private function copyImage() {<br />
        if(!empty($this-&gt;image) &amp;&amp; !empty($this-&gt;newImage)) {<br />
            if(!copy($this-&gt;getImage(), $this-&gt;getNewImage())) {<br />
                throw new Exception(&#8220;Não foi possível copiar o arquivo.&#8221;);<br />
            }<br />
            else {<br />
                $this-&gt;setImage($this-&gt;getNewImage());<br />
                $this-&gt;setNewImage(&#8220;&#8221;);<br />
                return true;<br />
            }<br />
        }<br />
        else {<br />
            throw new Exception(&#8220;Erro. Verifique os atributos &#8217;image&#8217; e &#8217;newImage&#8217;.&#8221;);<br />
        }<br />
    }<br />
    <br />
    /**<br />
     * Verifica se todos os atributos necessários para o redimensionamento da imagem foram informados.<br />
     * <br />
     * @access private<br />
     */<br />
    private function verifyAttributes() {<br />
        if(empty($this-&gt;image)) {<br />
            throw new Exception(&#8220;Atributo &#8217;image&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;imageType)) {<br />
            throw new Exception(&#8220;Atributo &#8217;imageType&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;height)) {<br />
            throw new Exception(&#8220;Atributo &#8217;height&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;width)) {<br />
            throw new Exception(&#8220;Atributo &#8217;width&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;newHeight)) {<br />
            throw new Exception(&#8220;Atributo &#8217;newHeight&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;newWidth)) {<br />
            throw new Exception(&#8220;Atributo &#8217;newWidth&#8217; não definido.&#8221;);<br />
        }<br />
    }</p>
<p>    /**<br />
     * Verifica se todos os atributos necessários para a imagem da marca d&#8217;agua foram informados.<br />
     * <br />
     * @access private<br />
     */<br />
    private function verifyWaterMarkAttributes() {<br />
        if(empty($this-&gt;waterMarkImage)) {<br />
            throw new Exception(&#8220;Atributo &#8217;waterMarkImage&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;waterMarkImageType)) {<br />
            throw new Exception(&#8220;Atributo &#8217;waterMarkImageType&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;waterMarkImageHeight)) {<br />
            throw new Exception(&#8220;Atributo &#8217;waterMarkHeight&#8217; não definido.&#8221;);<br />
        }<br />
        if(empty($this-&gt;waterMarkImageWidth)) {<br />
            throw new Exception(&#8220;Atributo &#8217;waterMarkImageWidth&#8217; não definido.&#8221;);<br />
        }<br />
    }</p>
<p>    /**<br />
     * Redimensiona a imagem conforme configurado.<br />
     *<br />
     * @return boolean<br />
     * @access public<br />
     * @uses verifyAttributes()<br />
     * @uses copyImage()<br />
     * @uses getProportional()<br />
     * @uses getProportionalFlag()<br />
     * @uses getImage()<br />
     * @uses getDegrees()<br />
     * @uses getBgColor()<br />
     * @uses getWaterMarkImage()<br />
     * @uses getWaterMarkPosition()<br />
     * @uses verifyWaterMarkAttributes()<br />
     * @uses getWaterMarkOpacity();<br />
     */<br />
    public function make() {<br />
        $this-&gt;verifyAttributes();<br />
        <br />
        /**<br />
         * Faz a cópia da imagem caso tenha sido informado um novo nome de arquivo em &#8217;newImage&#8217;.<br />
         */<br />
        if(!empty($this-&gt;newImage)) {<br />
            $this-&gt;copyImage();<br />
        }<br />
        <br />
        /**<br />
         * Calcula a Proporção para o redimencionamento.<br />
         */<br />
        if($this-&gt;getProportional() == 1) {<br />
            if($this-&gt;getProportionalFlag() == &#8217;H') {<br />
                /**<br />
                 * Calcula o novo tamanho Vertical para ser proporcional.<br />
                 */<br />
                $this-&gt;newHeight = round(($this-&gt;newWidth * $this-&gt;height) / $this-&gt;width);<br />
            }<br />
            elseif($this-&gt;getProportionalFlag() == &#8217;V') {<br />
                /**<br />
                 * Calcula o novo tamanho Horizontal para ser proporcional.<br />
                 */<br />
                $this-&gt;newWidth = round(($this-&gt;newHeight * $this-&gt;width) / $this-&gt;height);<br />
            }<br />
            else {<br />
                throw new Exception(&#8220;Valor incorreto no atributo &#8217;proportionalFlag&#8217;.&#8221;);<br />
            }<br />
        }<br />
        elseif($this-&gt;getProportional() != 0) {<br />
            throw new Exception(&#8220;Valor incorreto no atributo &#8217;proportional&#8217;.&#8221;);<br />
        }<br />
        <br />
        switch ($this-&gt;imageType) {<br />
            case 1:<br />
                $img    = imagecreatefromgif($this-&gt;getImage());<br />
                $newImg = imagecreate($this-&gt;newWidth, $this-&gt;newHeight);<br />
                break;<br />
            case 2:<br />
                $img    = imagecreatefromjpeg($this-&gt;getImage());<br />
                $newImg = imagecreatetruecolor($this-&gt;newWidth, $this-&gt;newHeight);<br />
                break;<br />
            case 3:<br />
                $img    = imagecreatefrompng($this-&gt;getImage());<br />
                $newImg = imagecreatetruecolor($this-&gt;newWidth, $this-&gt;newHeight);<br />
                break;<br />
            default:<br />
                throw new Exception(&#8220;Tipo de imagem informado não é compatível.&#8221;);<br />
                break;<br />
        }<br />
        <br />
        try {<br />
            imagecopyresized($newImg, $img, 0, 0, 0, 0, $this-&gt;newWidth, $this-&gt;newHeight, $this-&gt;width, $this-&gt;height);<br />
        }<br />
        catch (Exception $e) {<br />
            throw new Exception(&#8220;Não foi possível redimensionar a imagem.&#8221;);<br />
        }<br />
        <br />
        /**<br />
         * Gira a imagem.<br />
         */<br />
        if($this-&gt;getDegrees() != 0) {<br />
            try {<br />
                $newImg = imagerotate($newImg, $this-&gt;getDegrees(), $this-&gt;getBgColor());<br />
                /**<br />
                 * Pega os novos valores para &#8217;newHeight&#8217; e &#8217;newWidth&#8217;.<br />
                 */<br />
                $this-&gt;newWidth = imagesx($newImg);<br />
                $this-&gt;newHeight = imagesy($newImg);<br />
            }<br />
            catch (Exception $e) {<br />
                throw new Exception(&#8220;Não foi possível rotacionar a imagem.&#8221;);<br />
            }<br />
        }<br />
        <br />
        /**<br />
         * Adicionar uma marca d&#8217;agua na imagem pronta.<br />
         */<br />
        if(!empty($this-&gt;waterMarkImage)) {<br />
            try {<br />
                $tmp = getimagesize($this-&gt;getWaterMarkImage());<br />
                $this-&gt;waterMarkImageWidth  = $tmp[0];<br />
                $this-&gt;waterMarkImageHeight = $tmp[1];<br />
                $this-&gt;waterMarkImageType   = $tmp[2];<br />
                <br />
                if($this-&gt;waterMarkImageHeight &gt; $this-&gt;newHeight || <br />
                   $this-&gt;waterMarkImageWidth  &gt; $this-&gt;newWidth) {<br />
                    throw new Exception(&#8220;Marca d&#8217;agua é maior que imagem redimensionada.&#8221;);<br />
                }<br />
            }<br />
            catch (Exception $e) {<br />
                throw new Exception(&#8220;Não foi possível identificar o tamanho da imagem da marca d&#8217;agua.&#8221;);<br />
            }<br />
            <br />
            $this-&gt;verifyWaterMarkAttributes();<br />
            <br />
            switch ($this-&gt;waterMarkImageType) {<br />
                case 1:<br />
                    $markImg = imagecreatefromgif($this-&gt;getWaterMarkImage());<br />
                    break;<br />
                case 2:<br />
                    $markImg = imagecreatefromjpeg($this-&gt;getWaterMarkImage());<br />
                    break;<br />
                case 3:<br />
                    $markImg = imagecreatefrompng($this-&gt;getWaterMarkImage());<br />
                    break;<br />
                default:<br />
                    throw new Exception(&#8220;Tipo de imagem da marca d&#8217;agua informado não é compatível.&#8221;);<br />
                    break;<br />
            }<br />
            <br />
            /**<br />
             * Calcula a área onde será colocada a marca d&#8217;agua.<br />
             */<br />
            switch($this-&gt;getWaterMarkPosition()) {<br />
                case &#8217;topLeft&#8217;:<br />
                    $x = 10;<br />
                    $y = 10;<br />
                    break;<br />
                case &#8217;topCenter&#8217;:<br />
                    $x = round(($this-&gt;newWidth / 2) - ($this-&gt;waterMarkImageWidth / 2));<br />
                    $y = 10;<br />
                    break;<br />
                case &#8217;topRight&#8217;:<br />
                    $x = $this-&gt;newWidth - $this-&gt;waterMarkImageWidth - 10;<br />
                    $y = 10;<br />
                    break;<br />
                case &#8217;bottomLeft&#8217;:<br />
                    $x = 10;<br />
                    $y = $this-&gt;newHeight - $this-&gt;waterMarkImageHeight - 10;<br />
                    break;<br />
                case &#8217;bottomCenter&#8217;:<br />
                    $x = round(($this-&gt;newWidth / 2) - ($this-&gt;waterMarkImageWidth / 2));<br />
                    $y = $this-&gt;newHeight - $this-&gt;waterMarkImageHeight - 10;<br />
                    break;<br />
                case &#8217;bottomRight&#8217;:<br />
                    $x = $this-&gt;newWidth - $this-&gt;waterMarkImageWidth - 10;<br />
                    $y = $this-&gt;newHeight - $this-&gt;waterMarkImageHeight - 10;<br />
                    break;<br />
                case &#8217;center&#8217;:<br />
                    $x = round(($this-&gt;newWidth / 2) - ($this-&gt;waterMarkImageWidth / 2));<br />
                    $y = round(($this-&gt;newHeight / 2) - ($this-&gt;waterMarkImageHeight / 2));<br />
                    break;<br />
                default:<br />
                    $x = 10;<br />
                    $y = 10;<br />
            }<br />
            <br />
            /**<br />
             * Adiciona a marca d&#8217;agua na imagem.<br />
             */<br />
            try {<br />
                imagecopymerge($newImg, $markImg, $x, $y, 0, 0, $this-&gt;waterMarkImageWidth, $this-&gt;waterMarkImageHeight, $this-&gt;getWaterMarkOpacity());<br />
            }<br />
            catch (Exception $e) {<br />
                throw new Exception(&#8220;Não foi possível adicionar marca d&#8217;agua.&#8221;);<br />
            }<br />
        }<br />
        <br />
        /**<br />
         * Grava a imagem em arquivo.<br />
         */<br />
        try {<br />
            switch ($this-&gt;imageType) {<br />
             case 1:<br />
             imagegif($newImg, $this-&gt;getImage());<br />
             break;<br />
             case 2:<br />
             imagejpeg($newImg, $this-&gt;getImage(), 90);<br />
             break;<br />
             case 3:<br />
             imagepng($newImg, $this-&gt;getImage());<br />
             break;<br />
             default:<br />
                 throw new Exception(&#8220;Tipo de imagem informado não é compatível.&#8221;);<br />
             break;<br />
            }<br />
        }<br />
        catch (Exception $e) {<br />
            throw new Exception($e);<br />
        }<br />
        <br />
        return true;<br />
    }<br />
}<br />
?&gt;</p>
<p>Veja abaixo como é de facil utilização a classe que acabamos de criar:</p>
<p><font size="2" face="Courier New">try {<br />
    $obj = new Resize(&#8220;imagem.jpg&#8221;);<br />
    $obj-&gt;setNewImage(&#8220;novaImagem.jpg&#8221;);<br />
    $obj-&gt;setWaterMarkImage(&#8220;marcaDagua.gif&#8221;);<br />
    $obj-&gt;setWaterMarkOpacity(50);<br />
    $obj-&gt;setWaterMarkPosition(&#8216;bottomCenter&#8217;);<br />
    $obj-&gt;setProportionalFlag(&#8216;H&#8217;);<br />
    $obj-&gt;setProportional(1);<br />
    $obj-&gt;setDegrees(90);<br />
    $obj-&gt;setNewSize(500, 500);<br />
    $obj-&gt;make();<br />
}<br />
catch (Exception $e) {<br />
    die($e);<br />
}</font></p>
<p></font><font face="Courier New"><font face="Verdana">Pronto, acabamos tudo que é preciso para redimensionar as imagens em um site PHP.</font></font></p>
<p><center>&copy; <a href="http://www.cesar.inf.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/programacao/orientacao-a-objetos/criando-um-redimensionador-de-imagens/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Clientes Ricos Ajax na Web com Qooxdoo</title>
		<link>http://www.techtips.com.br/desenvolvimento-web/ajax/clientes-ricos-ajax-na-web-com-qooxdoo/</link>
		<comments>http://www.techtips.com.br/desenvolvimento-web/ajax/clientes-ricos-ajax-na-web-com-qooxdoo/#comments</comments>
		<pubDate>Fri, 11 May 2007 15:56:12 +0000</pubDate>
		<dc:creator>Leonel Togniolli</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Qooxdoo]]></category>

		<guid isPermaLink="false">http://www.techtips.com.br/semcategoria/clientes-ricos-ajax-na-web-com-qooxdoo/</guid>
		<description><![CDATA[Qooxdoo é&#160;uma biblioteca de interface visual escrita em JavaScript que provê um grande conjunto de controles permitindo a criação de clientes ricos no browser, tendo compatibilidade com vários browsers em várias plataformas, geralmente em aplicações AJAX. Ele tira proveito dos recursos de orientação a objeto de JavaScript (sabia que JavaScript é orientado a objeto?), tendo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.qooxdoo.org/">Qooxdoo</a> é&nbsp;uma biblioteca de interface visual escrita em JavaScript que provê um grande conjunto de controles permitindo a criação de clientes ricos no browser, tendo compatibilidade com vários browsers em várias plataformas, geralmente em aplicações AJAX.</p>
<p>Ele tira proveito dos recursos de orientação a objeto de JavaScript (sabia que JavaScript é orientado a objeto?), tendo <a href="http://demo.qooxdoo.org/current/apiviewer/">uma hierarquia poderosa de classes</a>. O <a href="http://www.codegear.com/br/products/delphi/php">Delphi para PHP</a> utiliza essa biblioteca para prover alguns recursos de forma bem automática, mas é possível utilizar o qooxdoo diretamente.</p>
<p>Para começar direto com a mão na massa, <a href="http://qooxdoo.org/download#quickstart">baixe a versão quickstart</a> do qooxdoo, descompacte em uma pasta, e abra&nbsp;o index.html em um browser qualquer. Já é possível clicar no botão e ver a clássica mensagem &#8220;Hello World&#8221;. Deste ponto, você pode abrir o Application.js e fazer algumas alteracões para brincar um pouco com os recursos que ele tem. Uma sugestão:</p>
<pre>qx.Proto.main = function(e)
{
        var docRoot=qx.ui.core.ClientDocument.getInstance();

        docRoot.setBackgroundColor("lightGray");

        var t1 = new qx.ui.form.TextField("Hello World");
        t1.setTop(25);
        t1.setLeft(10);

        var l1 = new qx.ui.basic.Label("Titulo");
        l1.setTop(10);
        l1.setLeft(10);

        var l2 = new qx.ui.basic.Label("&lt;a href='http://www.techtips.com.br'&gt;http://www.techtips.com.br&lt;/a&gt;");
        l2.setTop(50);
        l2.setLeft(10);

        var btnAbreJanela = new qx.ui.form.Button("Abre Janela");
        btnAbreJanela.setTop(22);
        btnAbreJanela.setLeft(95);
        btnAbreJanela.addEventListener("execute", function() {
            var w1=new qx.ui.window.Window(t1.getValue());
            w1.setSpace(20,180,48,80);
            docRoot.add(w1);

            var btnFechaJanela = new qx.ui.form.Button("Fecha Janela");
            btnFechaJanela.setTop(13);
            btnFechaJanela.setLeft(50);
            btnFechaJanela.addEventListener("execute", function() {
                w1.close();
            });

            w1.add(btnFechaJanela);

            w1.open();
        });

        docRoot.add(l1);
        docRoot.add(l2);
        docRoot.add(t1);
        docRoot.add(btnAbreJanela);
};</pre>
<p>Depois de copiar isso no seu arquivo .js, atualize o browser e crie várias janelas dentro do seu browser. Deixei disponível <a href="http://www.techtips.com.br/wp-content/uploads/Qooxdoo/HelloWorld/">um demo online</a> se você quiser ver o resultado diretamente. Ou ainda, veja o resultado rodando dentro do meu Firefox:</p>
<p><img height="243" src="http://www.techtips.com.br/wp-content/uploads/ClientesRicosAjaxnaWebcomQooxdoo_9A9B/QooxdooHelloWorld3.png" width="226" border="0"> </p>
<p>Para descobrir as classes que existem e suas propriedades, acompanhe a documentação do Qooxdoo pelo seu <a href="http://demo.qooxdoo.org/current/apiviewer/">API Viewer</a> (feito em Qooxdoo, aliás).</p>
<p>Depois disso, se você quiser utilizar o qooxdoo para um desenvolvimento maior, você deve instalar a versão completa, baixando o pacote do SDK. Vou escrever mais artigos detalhando a instalação dessa versão completa, a depuração de programas JavaScript dentro do browser, e algumas dicas da linguagem JavaScript (ela é bem mais poderosa do que muitos imaginam!). Fique ligado!</p>
<p><center>&copy; <a href="http://www.techtips.com.br">TechTips</a></center></p>]]></content:encoded>
			<wfw:commentRss>http://www.techtips.com.br/desenvolvimento-web/ajax/clientes-ricos-ajax-na-web-com-qooxdoo/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.673 seconds -->
