Ir para conteúdo
maiconparra

Conversão de JPEG e PNG para WEBP com imagewebp

Recommended Posts

Olá a todos me deparei com um pequeno problema irritante. Eu estou usando um código PHP parecido com este: 

 

$image = imagecreatefromjpeg($imagem);

imagewebp($image, $caminho_do_diretório/exemplo.webp, 100);

Para fazer a conversão de JPEG ou PNG para webp.

Porém algumas imagens, não sei se é dimensionamento ou outro fator. Por vezes fica em branco depois da conversão.

Eu já coloque em um if porque o retorno da função imagewebp é um boolean, fiz tratamento de exeção e não consigo capturar qual é o erro.

Se alguém já tiver passado por algo parecido e puder me dar uma luz. Ficaria muito grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está destruindo a imagem criada na variável $image?

Pode ser um problema de cache.

Já tive um problema similar e era apenas que eu não estava limpando a memória.

 

Mas tente criar uma nova imagem já aplicando as correções grb, então você copia essa imagem para corrigir eventuais problemas de dimensionamento.

Só então com essa cópia você cria o arquivo webp

 

Mais ou menos isso:

<?php
$arquivo = 'imagem.jpg';

$imagem = imagecreatefromjpeg($arquivo);

$imgX = imagesx($imagem);
$imgY = imagesy($imagem);
$novaImagem = imagecreatetruecolor($imgX, $imgY);
imagealphablending($novaImagem, false);
imagesavealpha($novaImagem, true);
imagecopyresampled($novaImagem, $imagem, 0, 0, 0, 0, $imgX, $imgY, $imgX, $imgY);

imagewebp($novaImagem, 'imagem.webp', 100);

imagedestroy($imagem); // Importante para limpar o cache

echo ("<img src=\"imagem.webp\" alt=\"\" />");

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por biakelly
      Oie, olha eu aqui novamente , essa questão é para quem esta acostumado com bugs que inicialmente não fazem sentido 
       
      Meu código funciona bem o objetivo dele é fazer algumas confirmações e mostrar o preço em real onde inicialmente tenho:
      <?php session_start(); include('../../sqlServices/db.php'); $nomemoeda = $_GET['nomemoeda']; $valormoeda = $_GET['valormoeda']; $brl = $_GET['brl']; $usdconvert = $usdimport; $check = "SELECT `limite`,`percentual` FROM `biaContabilidade`.`moedatbl` WHERE `nomemoeda`='$nomemoeda' AND `isactive`=1"; $checkr = mysqli_query($con, $check); $rowct = mysqli_fetch_array($checkr); $limit = $rowct['limite']; if ($valormoeda < $limit) { // echo "<script> alert ( 'limite abaixo'); </script>"; echo "true"; } else { $percentual = $rowct['percentual']; $percentual = $percentual / 100; $percentual = $brl * $percentual; $appliedpercentualBRLValue = $brl + $percentual; $brl = number_format($brl * 100); // echo "Pay R$ " .$brl."/-"; echo $brl; }  
      Não suficiente estou tentando mostrar o preço que é exibido neste código em dólar uma vez que tenho um crontab pegando a taxa e a atualizando a cada 2 horas (eu sei é muito, mas é uma condição interna), desta forma complementei o código assim:
       
      <?php session_start(); include('../../sqlServices/db.php'); $usdimport = file_get_contents("../Textvalue/valuebrl.txt"); $nomemoeda = $_GET['nomemoeda']; $valormoeda = $_GET['valormoeda']; $brl = $_GET['brl']; $usdconvert = $usdimport; $check = "SELECT `limite`,`percentual` FROM `biaContabilidade`.`moedatbl` WHERE `nomemoeda`='$nomemoeda' AND `isactive`=1"; $checkr = mysqli_query($con, $check); $rowct = mysqli_fetch_array($checkr); $limit = $rowct['limite']; if ($valormoeda < $limit) { // echo "<script> alert ( 'limite abaixo'); </script>"; echo "true"; } else { $percentual = $rowct['percentual']; $percentual = $percentual / 100; $percentual = $brl * $percentual; $appliedpercentualBRLValue = $brl + $percentual; $brl = number_format($brl * 100 / $usdconvert); // echo "Pay R$ " .$brl."/-"; echo $brl; } como pode ver adicionei o caminho da minha cotação:
      $usdimport = file_get_contents("../Textvalue/valuebrl.txt");
       
      e mudei o final do código:
      $brl = number_format($brl * 100 / $usdconvert);
       
      Bem, localmente ele funciona direitinho, faz a conversão normal e exibe um poupup com o carrinho da stripe e o preço em dólar do jeito que preciso, mas online não funciona. Curiosamente o caminho esta correto.
       
      Não consigo entender, será que estou usando alguma rotina aqui erroneamente?
    • Por stumpy
      Boa  noite gente estou com um site em asp clássico que até indexa no google  usei a imagem amp mas quando vou postar no facebook ou outras redes sociais ela não aparece  vi que tem o componente  para  transformar um jpg  em um webp  só que não achei nada em asp clássico alguém sabe como  consegue me ajudar ?
    • Por Hyroshima
      bom-dia pessoal, não tenho conhecimento para fazer essa conversão ou deixar compatível, se alguém puder por favor fazer isso pra mim ficarei agradecido de coração.
       
      meu problema é o código abaixo que está usando biblioteca do windows WINSOCK2.H para fazer um ping no ip fornecido por um comando ping("ip")  e retornar uma msg igual ao ping do windows, gostaria se possível que o mesmo fosse utilizado em linux (centos) mantendo a mesma funcionalidade ?
       
      ping.c
      #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include <WINSOCK2.H> #define DEF_BUF_SIZE 1024 #define IP_HEADER_SIZE 20 #define ICMP_HEADER_SIZE 12 typedef struct _ICMP_HEADER { BYTE bType; BYTE bCode; USHORT nCheckSum; USHORT nId; USHORT nSequence; UINT nTimeStamp; }ICMP_HEADER, *PICMP_HEADER; USHORT GetCheckSum(LPBYTE lpBuff, DWORD dwSize) { DWORD dwCheckSum = 0; USHORT* lpWord = (USHORT*)lpBuff; while(dwSize > 1) { dwCheckSum += *lpWord++; dwSize -= 2; } if(dwSize ==1) dwCheckSum += *((LPBYTE)lpBuff); dwCheckSum = (dwCheckSum >> 16) + (dwCheckSum & 0XFFFF); return (USHORT)(~dwCheckSum); } BOOL Ping(char* lpDestIP, int *nRet_, int *nTime_) { int nTime = 0; int ret = 0; char ICMPPack[ICMP_HEADER_SIZE] = {0}; char szRcvBuff[DEF_BUF_SIZE] = {0}; int i = 0; int nRet = 0; int nLen = 0; int nError = 0; SOCKET s; PICMP_HEADER pRcvHeader; SOCKADDR_IN SourceSockAddr; SOCKADDR_IN DestSockAddr; PICMP_HEADER pICMPHeader; DestSockAddr.sin_family = AF_INET; DestSockAddr.sin_addr.S_un.S_addr = inet_addr(lpDestIP); DestSockAddr.sin_port = htons(0); pICMPHeader = (PICMP_HEADER)ICMPPack; pICMPHeader->bType = 8; pICMPHeader->bCode = 0; pICMPHeader->nId = (USHORT)GetCurrentProcessId(); pICMPHeader->nCheckSum = 0; pICMPHeader->nTimeStamp = 0; s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); nTime = 1000; ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nTime, sizeof(nTime)); for(i=0; i <1; i++) { pICMPHeader->nCheckSum = 0; pICMPHeader->nSequence = i; pICMPHeader->nTimeStamp = GetTickCount(); pICMPHeader->nCheckSum = GetCheckSum((LPBYTE)(ICMPPack), ICMP_HEADER_SIZE); nRet = sendto(s, ICMPPack, ICMP_HEADER_SIZE, 0, (SOCKADDR*)&DestSockAddr, sizeof(DestSockAddr)); if(nRet == SOCKET_ERROR) { return FALSE; } nLen = sizeof(SOCKADDR_IN); if(nRet == SOCKET_ERROR) { return FALSE; } nRet = recvfrom(s, szRcvBuff,DEF_BUF_SIZE,0,(SOCKADDR*)&SourceSockAddr,&nLen); if(nRet == SOCKET_ERROR) { return FALSE; } pRcvHeader = (PICMP_HEADER)(szRcvBuff + IP_HEADER_SIZE); nTime = GetTickCount() - pRcvHeader->nTimeStamp; //printf("Return Message: %s bytes=%d time=%dms\n", inet_ntoa(SourceSockAddr.sin_addr), nRet, nTime); *nRet_ = nRet; *nTime_ = nTime; } return TRUE; }  
      a outra estrutura:
      #include "ping.c" BUILDIN_FUNC(ping) { // const char *name; char _cmd[500]; int nRet=0, nTime=0; // // name = script_getstr(st,2); Ping((char *)name, &nRet, &nTime); if( nRet <= 0 || nTime < 0 ) sprintf(_cmd,"Return Message: %s fail to connect", (char *)name); else sprintf(_cmd,"Return Message: %s bytes=%d time=%dms\n", (char *)name, nRet, nTime); // script_pushstrcopy(st, _cmd); return 0; } BUILDIN_DEF(ping,"s")  
      Desde já muito obrigado, fiz algumas buscas mas não achei nada que possa me ajudar a fazer essa conversão ou até mesmo redigir o código para funcionar em linux.
    • Por Victordiniz
      Bom dia a todos, confesso que não sei quase nada de html mais estou tentando, quem poder me ajudar fico muito agradecido.
      Bom estou criando um efeito html que é composto por 3 imagens que ao passar o mouse a imagem 1 é substituída por a 2 e ao tirar o mouse pela imagem 3.
      Porém a imagem 2 irá ser no formato WebP  e com isso estou tendo problemas no navegador Firefox que não suporta o formato.
      A unica alternativa seria dentro do efeito chamar uma imagem Jpg pra substituír a Webp quando o navegador não suportar. E ai que está o problema não estou conseguindo chamar essa imagem. Desde já muito obrigado. 
       
      Esse é o HTML:
       
      <a href="ENDEREÇO-DO-LINK"><img src="ENDEREÇO-DA-IMAGEM-1" border="0" onmouseover="this.src='ENDEREÇO-DA-IMAGEM-2'" onmouseout="this.src='ENDEREÇO-DA-IMAGEM-1'"></a>
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.