Ir para conteúdo
Entre para seguir isso  
sergionpinheiro

Redimensionar PNG com fundo transparente

Recommended Posts

Bom dia Galera,

 

Estou com uma pequena dúvida. Estou usando uma classe para fazer redimensionamento de imagens. Ela está funcionando perfeitamente, o meu problema é que quanto redimensiono uma imagem .png, a nova imagem fica com fundo PRETO. Alguém sabe dizer como faço para ficar com fundo transparente?

 

Segue a classe:

 

<?php
# ========================================================================#
#
# Author: Jarrod Oberto
# Version: 1.0
# Date: 17-Jan-10
# Purpose: Resizes and saves image
# Requires : Requires PHP5, GD library.
# Usage Example:
# include("classes/resize_class.php");
# $resizeObj = new resize('images/cars/large/input.jpg');
# $resizeObj -> resizeImage(150, 100, 0);
# $resizeObj -> saveImage('images/cars/large/output.jpg', 100);
#
#
# ========================================================================#
Class resize
{
// *** Class variables
private $image;
private $width;
private $height;
private $imageResized;
function __construct($fileName)
{
// *** Open up the file
$this->image = $this->openImage($fileName);
// *** Get width and height
$this->width = imagesx($this->image);
$this->height = imagesy($this->image);
}
## --------------------------------------------------------
private function openImage($file)
{
// *** Get extension
$extension = strtolower(strrchr($file, '.'));
switch($extension)
{
case '.jpg':
case '.jpeg':
$img = @imagecreatefromjpeg($file);
break;
case '.gif':
$img = @imagecreatefromgif($file);
break;
case '.png':
$img = @imagecreatefrompng($file);
break;
default:
$img = false;
break;
}
return $img;
}
## --------------------------------------------------------
public function resizeImage($newWidth, $newHeight, $option="auto")
{
// *** Get optimal width and height - based on $option
$optionArray = $this->getDimensions($newWidth, $newHeight, $option);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
// *** Resample - create image canvas of x, y size
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);
// *** if option is 'crop', then crop too
if ($option == 'crop') {
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);
}
}
## --------------------------------------------------------
private function getDimensions($newWidth, $newHeight, $option)
{
switch ($option)
{
case 'exact':
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
break;
case 'portrait':
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
break;
case 'landscape':
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
break;
case 'auto':
$optionArray = $this->getSizeByAuto($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
case 'crop':
$optionArray = $this->getOptimalCrop($newWidth, $newHeight);
$optimalWidth = $optionArray['optimalWidth'];
$optimalHeight = $optionArray['optimalHeight'];
break;
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getSizeByFixedHeight($newHeight)
{
$ratio = $this->width / $this->height;
$newWidth = $newHeight * $ratio;
return $newWidth;
}
private function getSizeByFixedWidth($newWidth)
{
$ratio = $this->height / $this->width;
$newHeight = $newWidth * $ratio;
return $newHeight;
}
private function getSizeByAuto($newWidth, $newHeight)
{
if ($this->height < $this->width)
// *** Image to be resized is wider (landscape)
{
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
}
elseif ($this->height > $this->width)
// *** Image to be resized is taller (portrait)
{
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
}
else
// *** Image to be resizerd is a square
{
if ($newHeight < $newWidth) {
$optimalWidth = $newWidth;
$optimalHeight= $this->getSizeByFixedWidth($newWidth);
} else if ($newHeight > $newWidth) {
$optimalWidth = $this->getSizeByFixedHeight($newHeight);
$optimalHeight= $newHeight;
} else {
// *** Sqaure being resized to a square
$optimalWidth = $newWidth;
$optimalHeight= $newHeight;
}
}
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function getOptimalCrop($newWidth, $newHeight)
{
$heightRatio = $this->height / $newHeight;
$widthRatio = $this->width / $newWidth;
if ($heightRatio < $widthRatio) {
$optimalRatio = $heightRatio;
} else {
$optimalRatio = $widthRatio;
}
$optimalHeight = $this->height / $optimalRatio;
$optimalWidth = $this->width / $optimalRatio;
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight);
}
## --------------------------------------------------------
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight)
{
// *** Find center - this will be used for the crop
$cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );
$cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );
$crop = $this->imageResized;
//imagedestroy($this->imageResized);
// *** Now crop from center to exact requested size
$this->imageResized = imagecreatetruecolor($newWidth , $newHeight);
imagecopyresampled($this->imageResized, $crop, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}
## --------------------------------------------------------
public function saveImage($savePath, $imageQuality="100")
{
// *** Get extension
$extension = strrchr($savePath, '.');
$extension = strtolower($extension);
switch($extension)
{
case '.jpg':
case '.jpeg':
if (imagetypes() & IMG_JPG) {
imagejpeg($this->imageResized, $savePath, $imageQuality);
}
break;
case '.gif':
if (imagetypes() & IMG_GIF) {
imagegif($this->imageResized, $savePath);
}
break;
case '.png':
// *** Scale quality from 0-100 to 0-9
$scaleQuality = round(($imageQuality/100) * 9);
// *** Invert quality setting as 0 is best, not 9
$invertScaleQuality = 9 - $scaleQuality;
if (imagetypes() & IMG_PNG) {
imagepng($this->imageResized, $savePath, $invertScaleQuality);
}
break;
// ... etc
default:
// *** No extension - No save.
break;
}
imagedestroy($this->imageResized);
}
## --------------------------------------------------------
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve salvar o canal alpha, com isto você conseguirá o fundo transparante, para tanto use imagesavealpha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tchê, leia o manual... tente, não espere alguém pensar por você... já tentou? Sim? Não deu certo, estamos aqui para te ajudar, posta as últimas 5 tentativas que você fez para que possamos analisar a real dificuldade que você esta tendo.

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
Entre para seguir isso  

  • Conteúdo Similar

    • Por KD14
      Exemplo: Meu arquivo no illustrator tem as dimensões de 2000 x 2000 px (o mesmo tamanho da prancheta), quando eu exporto para JPEG ou PNG ele fica com as dimensões de 4168 x 4167.
      Alguém sabe o porque disso?
    • Por eduardoalmeida
      Seguinte galera!!! 
      Estou criando um logotipo pessoal, pra apresentação de um trabalho.. porém sou iniciante em photoshop.. sei quase nada rs 
      Poderiam me ajudar??!!
       
      Seguinte, gostaria de fazer essas 3 "faixas" da imagem
       

       
      Exatamente 3 faixas assim.. como é o nome? Talvez com nome encontro tutoriais no youtube rs 
       
      Agradeço desde já!
    • 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>
    • Por Ctgabriel
      Gente, como eu crio uma imagem com um texto que o user digitar porem essa imagem eu quero sobrepor a outra e o fundo dessa imagem do texto q o user digitou tem q ser transparente, alg tem alguma noção de como faço, 
      Ps: eu não quero que perca a qualidade da img em monitores maiores
    • Por Alvaro Pacífico Serpa
      Olá pessoal sou novo no CSS e estou com um pequeno problema, deve ser fácil de resolver mas sou novato nessa área. Tenho uma div sidebar com float: rigth e width:300px fixo e tenho uma div responsivo com float:left e width:100%, o que eu preciso é que a div responsivo fique com 100% do lado da sidebar ocupando o máximo que puder, tipo como na imagem. Qual comando posso usar?

×

Informação importante

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