Redimensionar e manipular imagens em PHP (com exemplos)

No meu tutorial anterior, discutimos a manipulação básica de imagens usando a biblioteca PHP GD. Nesse tutorial, dei uma breve introdução à biblioteca e mostrei como carregar imagens de um arquivo ou criá-las do zero em PHP. Depois disso, aprendemos a cortar, girar, dimensionar e inverter uma imagem usando GD. eu cobri o imagefilter() função para aplicar diferentes filtros aos recursos de imagem carregados no script. Eu também mencionei algumas funções úteis no GD como imagesx() e imagesy() para obter a largura e a altura da imagem carregada.

No final do meu último tutorial de GD, você aprendeu como usar a biblioteca para automatizar tarefas básicas como redimensionar todas as imagens em um diretório ou aplicar filtros como escala de cinza nelas antes de salvar o resultado final. Se você nunca usou a biblioteca PHP GD antes, eu sugiro que você leia o artigo introdutório do GD antes de ler este.

Neste tutorial, aprenderemos sobre muitas outras funções úteis no GD e como elas podem ser usadas para automatizar mais tarefas de manipulação de imagens.

Manipulando imagens usando uma matriz de convolução

Exceto pelos pixels nas bordas, cada pixel em uma imagem é cercado por outros oito pixels. Efeitos como desfoque ou detecção de borda são calculados para cada pixel dependendo do valor desse pixel e dos valores dos pixels ao redor. Na detecção de bordas, por exemplo, uma mudança brusca na cor implica que alcançamos a borda de algum objeto na imagem. Por exemplo, uma mudança repentina de branco para marrom na imagem abaixo significará o limite da xícara e da mesa.

Uma maneira fácil de especificar esse tipo de filtro é com o que é chamado de “matriz de convolução”. GD fornece o imageconvolution( $image, $matrix, $div, $offset) função para aplicar uma matriz de convolução 3×3 a um recurso de imagem $image.

o $matrix O parâmetro é uma matriz de três matrizes, cada uma contendo três valores flutuantes — ou seja, é uma matriz 3×3. O primeiro elemento da primeira matriz é multiplicado pelo valor da cor do pixel superior esquerdo. Da mesma forma, o segundo elemento da primeira matriz é multiplicado pelo valor da cor do pixel diretamente no topo do pixel central. A cor final do pixel é obtida somando o resultado de todas essas multiplicações e depois dividindo por $div para normalização. A normalização geralmente mantém o valor final da cor abaixo de 255.

Como vimos, o $div O parâmetro é usado como divisor do resultado da convolução para normalizar seu valor. o $offset O parâmetro, por outro lado, é usado para especificar um valor de deslocamento para todas as cores. Você verá como isso afeta o resultado final nos exemplos abaixo.

Exemplos de convolução

Aqui está uma lista de algumas matrizes de convolução diferentes que aplicamos à imagem de uma xícara em uma mesa.

Borrão de caixa

O desfoque de caixa funciona apenas calculando a média de cada pixel com seus vizinhos. Definimos o valor do divisor como 9 porque a soma de todos os elementos nas três matrizes é 9.

Afiado

Sharpen funciona exagerando as diferenças entre cada pixel e seus vizinhos. Isso torna as bordas um pouco mais claras. No caso de sharpen, o divisor ainda é 1 porque a soma de todos os elementos nas três matrizes é 1.

Gravar

A matriz de relevo é semelhante à matriz de nitidez, exceto que os valores são negativos no canto superior esquerdo e positivos no canto inferior direito – é isso que cria o efeito de relevo. A soma de todos os elementos no caso da matriz de convolução de relevo é 1, então não precisamos nos preocupar com normalização ou deslocamento de cor.

Detecção de borda

A detecção de borda é semelhante à nitidez, mas o efeito é ainda mais forte. Além disso, o valor original da imagem não recebe mais peso do que os vizinhos – isso significa que nos preocupamos apenas com as bordas, não com as áreas originais de cores sólidas.

Com a detecção de bordas, a soma de todos os elementos da matriz é 0. Isso significa que a imagem que obteremos será principalmente preta, a menos que haja uma mudança acentuada na cor, que geralmente ocorre nas bordas dos objetos. A imagem predominantemente preta pode ser transformada em branco definindo o parâmetro de deslocamento para 255.

A imagem a seguir mostra o resultado de todas essas matrizes de convolução.

Matriz de ConvoluçãoMatriz de ConvoluçãoMatriz de Convolução

Funções de cópia de imagem

PHP GD tem muitas funções para copiar parte de uma imagem e depois redimensioná-la ou mesclá-la. Ao usar essas funções, é importante lembrar que o PHP considera o canto superior esquerdo de um recurso de imagem como sua origem. Um positivo x valor irá levá-lo para a direita da imagem, e um positivo y valor irá levá-lo mais para baixo.

A mais simples dessas funções é imagecopy( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h). Ele copiará a imagem de origem em uma imagem de destino. o $dst_x e $dst_y parâmetros determinam o canto superior esquerdo, onde a imagem copiada será colada. o $src_x, $src_y, $src_we $src_h parâmetros determinam a parte retangular da imagem de origem, que será copiada para o destino.

Você pode usar esta função para cortar imagens criando uma imagem do zero usando imagecreatetruecolor() e copiando o retângulo de corte da imagem de origem para ele. Você também pode usá-lo para adicionar marcas d’água nas imagens, mas lembre-se de que, com esse método, o tamanho da marca d’água não pode ser alterado de acordo com o tamanho de nossas imagens.

Uma solução para este problema é usar o imagecopyresized( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) função. Aceita todos os parâmetros de imagecopy() e dois parâmetros adicionais para determinar o tamanho da área de destino onde a imagem de origem será copiada.

o imagecopyresized() função não é perfeita, pois não dimensiona a imagem para cima e para baixo muito bem. No entanto, você pode obter um redimensionamento de melhor qualidade usando o imagecopyresampled() função, que aceita todos os mesmos parâmetros.

Copiar com transparência

Existem mais duas funções relacionadas à cópia de imagens que você achará muito úteis: imagecopymerge() e imagecopymergegray().

A função imagecopymerge( $dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) é similar a imagecopy()onde o adicional $pct parâmetro determina a transparência da imagem copiada. Um valor de 0 significa sem transparência e um valor de 100 significa transparência completa. Isso será de grande ajuda quando você não quiser ocultar completamente o conteúdo da imagem principal atrás de sua marca d’água.

o imagecopymergegray() A função, por outro lado, usa o último parâmetro para converter a imagem de origem em escala de cinza. Se estiver definido como 0, a imagem de origem perderá toda a sua cor. Se estiver definido como 100, a imagem de origem permanecerá inalterada.

Exemplo de cópia de imagem

O exemplo a seguir usa o imagecopy() função para transformar a metade direita de uma imagem em seu negativo. Já discutimos outras funções como imagefilter() e imagescale() usado neste trecho de código no tutorial anterior.

Aqui, criamos duas cópias da imagem original, cada uma das quais foi reduzida para ter 800 pixels de largura. Depois disso, usamos o imagefilter() função para criar um negativo do $img_php_inv recurso de imagem. A metade direita desta imagem negativa é então copiada para a imagem original usando o imagecopy() função.

Este foi um uso muito básico do imagecopy() função. Você pode ver os resultados abaixo. Você também pode dividir a imagem em seções ou listras menores para criar efeitos de imagem mais interessantes. Nós usaremos o imagecopymergegray() função no trecho de código abaixo para criar muito mais listras na imagem original do peixe.

O exemplo de código acima usa uma estratégia semelhante ao exemplo anterior, mas desta vez dividimos a imagem em faixas menores, que são transformadas em escala de cinza ou mantidas inalteradas com base no valor da variável $i. Depois de concluir todas as operações de mesclagem de cópia, aplicamos dois filtros na imagem para destacar as listras.

A imagem a seguir mostra o resultado final dessas duas funções em conjunto com diferentes filtros de imagem.

Mosaico de Peixe PHP GDMosaico de Peixe PHP GDMosaico de Peixe PHP GD

Incorporação de marcas d'água ou outras informações em imagens

Algumas organizações adicionam marcas d'água às suas imagens para deixar claro que elas são proprietárias da imagem. Também ajuda no reconhecimento da marca e desencoraja outras pessoas a copiar descaradamente as imagens. Graças ao PHP GD, imagens de marca d'água são uma tarefa simples.

No trecho de código acima, criamos dois recursos de imagem diferentes usando imagecreatefromjpeg() para a imagem principal e imagecreatefrompng() para a marca d'água, respectivamente. Determinamos a largura e a altura da imagem principal usando o imagesx() e imagesy() funções.

Nem todas as imagens que você deseja marcar com marca d'água terão as mesmas dimensões. Se você não redimensionar a marca d'água com base nas dimensões da imagem principal, pode parecer estranho. Por exemplo, uma marca d'água de 200 px pode ficar bem em uma imagem de 1.000 px, mas será muito grande para uma imagem de 600 px de largura e pode parecer muito pequena em uma imagem de 2.400 px.

Portanto, usamos o imagescale() função para manter sempre a marca d'água em um quinto da largura da imagem original. Usamos então o imagecopy() função para colocar a marca d'água no local certo. Aqui está o resultado final do trecho de código acima.

Adicionar marca d'água a imagens usando GDAdicionar marca d'água a imagens usando GDAdicionar marca d'água a imagens usando GD

Além das marcas d'água, você também pode adicionar outras informações, como o local onde a fotografia foi tirada ou a hora em que a fotografia foi tirada.

Pensamentos finais

Depois de abordar os conceitos básicos de manipulação de imagens em nosso tutorial anterior, aprendemos sobre algumas outras funções úteis na biblioteca GD. A primeira parte do tutorial discutiu como podemos manipular imagens em PHP usando a matriz de convolução. Também mostrei alguns exemplos da operação da matriz de convolução para ajudá-lo a entender como o PHP chega aos valores de cor de diferentes pixels.

A segunda parte do tutorial explicou como copiar e/ou redimensionar parte de uma imagem para colá-la em outro lugar. Isso é útil quando queremos adicionar algo a uma imagem como uma marca d'água ou um carimbo de data/hora.

Tente usar todas essas funções para criar alguns efeitos de imagem interessantes!

[ad_2]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *