Vra

Die volgende PHP kode uit gebruik GD om 'n leser gelaai PNG grootte te 128x128. Dit werk baie goed, behalwe dat die deursigtige areas in die oorspronklike beeld word vervang met 'n stewige color- swart in my geval.

Hoewel imagesavealpha gestel, iets is nie heeltemal reg.

Wat is die beste manier om die deursigtigheid in die pixel afmetingen beeld te bewaar?

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );    
imagesavealpha( $targetImage, true );

$targetImage = imagecreatetruecolor( 128, 128 );
imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );
Was dit nuttig?

Oplossing

imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

het dit vir my. Dankie ceejayoz.

noot, beeld die teiken moet die alfa instellings, nie die beeld van die bron.

Edit: volle vervangingswaarde kode. Sien ook antwoorde hieronder en hul kommentaar. Dit is nie gewaarborg om te wees sal jy opreg wees in enige manier nie, maar het my behoeftes te bereik in die tyd.

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile ); 

$targetImage = imagecreatetruecolor( 128, 128 );   
imagealphablending( $targetImage, false );
imagesavealpha( $targetImage, true );

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

Ander wenke

Hoekom dink jy dinge so ingewikkeld maak? Die volgende is wat ek gebruik en tot dusver het dit die werk gedoen vir my.

$im = ImageCreateFromPNG($source);
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]);
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0));
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]);

Ek glo dit moet doen die truuk:

$srcImage = imagecreatefrompng($uploadTempFile);
imagealphablending($srcImage, false);
imagesavealpha($srcImage, true);

wysig Iemand in die PHP dokumente beweer imagealphablending moet ware, nie vals wees. YMMV.

'n toevoeging wat sommige mense dalk help:

Dit is moontlik om imagealphablending wissel, terwyl die bou van die beeld. Ek die spesifieke geval wat ek hierdie nodig, ek wou 'n paar semi-deursigtige PNG se kombineer op 'n deursigtige agtergrond.

Eerste wat jy stel imagealphablending vals en die nuutgeskepte beeld ware kleur te vul met 'n deursigtige kleur. As imagealphablending waar is, sou niks gebeur nie, want die deursigtige vul sou saamsmelt met die swart verstek agtergrond en lei tot swart.

Dan wissel imagealphablending om ware en voeg 'n paar PNG beelde op die doek en laat 'n paar van die agtergrond sigbaar (bv. Die hele beeld nie vul).

Die resultaat is 'n beeld met 'n deursigtige agtergrond en verskeie gekombineerde PNG beelde.

Ek het 'n funksie vir beeld resizing soos JPEG / GIF / PNG met copyimageresample en PNG beelde steeds hou daar deursigtigheid:

$myfile=$_FILES["youimage"];

function ismyimage($myfile) {
    if((($myfile["type"] == "image/gif") || ($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") || ($myfile["type"] == "image/png")) && ($myfile["size"] <= 2097152 /*2mb*/) ) return true; 
    else return false;
}

function upload_file($myfile) {         
    if(ismyimage($myfile)) {
        $information=getimagesize($myfile["tmp_name"]);
        $mywidth=$information[0];
        $myheight=$information[1];

        $newwidth=$mywidth;
        $newheight=$myheight;
        while(($newwidth > 600) || ($newheight > 400 )) {
            $newwidth = $newwidth-ceil($newwidth/100);
            $newheight = $newheight-ceil($newheight/100);
        } 

        $files=$myfile["name"];

        if($myfile["type"] == "image/gif") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromgif($myfile["tmp_name"]);
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagegif($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con){
                return true;
            } else {
                return false;
            }
        } else if(($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") ) {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefromjpeg($myfile["tmp_name"]); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagejpeg($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {  
                return true;
            } else {
                return false;
            }
        } else if($myfile["type"] == "image/png") {
            $tmp=imagecreatetruecolor($newwidth,$newheight);
            $src=imagecreatefrompng($myfile["tmp_name"]);
            imagealphablending($tmp, false);
            imagesavealpha($tmp,true);
            $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127);
            imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); 
            imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight);
            $con=imagepng($tmp, $files);
            imagedestroy($tmp);
            imagedestroy($src);
            if($con) {
                return true;
            } else {
                return false;
            }
        }   
    } else
          return false;
}

Ek dink dat hierdie die truuk kan doen:

$uploadTempFile = $myField[ 'tmp_name' ]
list( $uploadWidth, $uploadHeight, $uploadType ) 
  = getimagesize( $uploadTempFile );

$srcImage = imagecreatefrompng( $uploadTempFile );

$targetImage = imagecreatetruecolor( 128, 128 );

$transparent = imagecolorallocate($targetImage,0,255,0);
imagecolortransparent($targetImage,$transparent);
imagefilledrectangle($targetImage,0,0,127,127,$transparent);

imagecopyresampled( $targetImage, $srcImage, 
                    0, 0, 
                    0, 0, 
                    128, 128, 
                    $uploadWidth, $uploadHeight );

imagepng(  $targetImage, 'out.png', 9 );

Die nadeel is dat die beeld sal gestroop word van elke 100% groen pixels. In elk geval, hoop dit help:)

hergradering die behoud van deursigtigheid, dan ja hou wat in ander poste imagesavealpha () moet gestel is, sal tot die alfa vlag imagealphablending (gebruik) moet ingestel word om valse anders dit nie werk nie.

Ook ek raakgesien twee klein dingetjies in jou kode:

  1. Jy hoef nie te getimagesize() bel om die wydte / hoogte vir imagecopyresmapled() kry
  2. Die $uploadWidth en $uploadHeight moet -1 die waarde, aangesien die cordinates begin by 0 en nie 1, so dit sal hulle in 'n leë pixel kopieer. Dit te vervang met: imagesx($targetImage) - 1 en imagesy($targetImage) - 1, relativily moet doen:)

Hier is my totale toets kode. Dit werk vir my

$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION);
$filename = 'test.' . $imageFileType;
move_uploaded_file($_FILES["image"]["tmp_name"], $filename);

$source_image = imagecreatefromjpeg($filename);

$source_imagex = imagesx($source_image);
$source_imagey = imagesy($source_image);

$dest_imagex = 400;
$dest_imagey = 600;
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);

imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey);

imagesavealpha($dest_image, true);
$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127);
imagefill($dest_image, 0, 0, $trans_colour);

imagepng($dest_image,"test1.png",1);

Let op width en height waardes beeld se die bron wat geslaag om funksie imagecopyresampled. As hulle groter as die werklike beeld bron grootte, sal die res van die beeld area gevul met swart kleur.

Ek gekombineerde die antwoorde van ceejayoz en Cheekysoft, wat die beste resultaat het vir my. Sonder imagealphablending () en imagesavealpha () die beeld is nie duidelik:

$img3 = imagecreatetruecolor(128, 128);
imagecolortransparent($img3, imagecolorallocate($img3, 0, 0, 0));
imagealphablending( $img3, false );
imagesavealpha( $img3, true );
imagecopyresampled($img3, $srcImage, 0, 0, 0, 0, 128, 128, $uploadWidth, $uploadHeight);
imagepng($img3, 'filename.png', 9);
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top