Frage

Ich versuche pngs mit transparentem Hintergrund in PHP und die Codebeispielen ich online für mich nicht um die Größe arbeitet gefunden haben. Hier ist der Code, den ich verwende, wird Beratung sehr geschätzt werden!

$this->image = imagecreatefrompng($filename);

imagesavealpha($this->image, true);
$newImage = imagecreatetruecolor($width, $height);

// Make a new transparent image and turn off alpha blending to keep the alpha channel
$background = imagecolorallocatealpha($newImage, 255, 255, 255, 127);
imagecolortransparent($newImage, $background);
imagealphablending($newImage, false);
imagesavealpha($newImage, true);

imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $width, $height,  $this->getWidth(), $this->getHeight());
$this->image = $newImage;  
imagepng($this->image,$filename);


Aktualisieren Mit ‚nicht funktioniert‘ Ich wollte die Hintergrundfarbe in Schwarz geändert sagen, wenn ich pngs ändern.

War es hilfreich?

Lösung

Von dem, was ich sagen kann, müssen Sie den Mischmodus auf false und den Alpha-Kanal-Flag speichern true vor Sie tun, um die imagecolorallocatealpha ()

<?php
 $newImg = imagecreatetruecolor($nWidth, $nHeight);
 imagealphablending($newImg, false);
 imagesavealpha($newImg,true);
 $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
 imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);
 imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight,
                      $imgInfo[0], $imgInfo[1]);
?>

UPDATE . Dieser Code funktioniert nur auf dem Hintergrund transparent mit Opazität = 0. Wenn Ihr Bild hat 0

Andere Tipps

Hier ist eine endgültige Lösung, die gut für mich funktioniert.

function resizePng($im, $dst_width, $dst_height) {
    $width = imagesx($im);
    $height = imagesy($im);

    $newImg = imagecreatetruecolor($dst_width, $dst_height);

    imagealphablending($newImg, false);
    imagesavealpha($newImg, true);
    $transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
    imagefilledrectangle($newImg, 0, 0, $width, $height, $transparent);
    imagecopyresampled($newImg, $im, 0, 0, 0, 0, $dst_width, $dst_height, $width, $height);

    return $newImg;
}

Die Füllung des neuen Bildes mit einer transparenten Farbe ist ebenfalls erforderlich (wie Dycey codiert aber ich glaube vergessen zu erwähnen :)), nicht nur die ‚strategische‘ von selbst zu speichern.

IIRC, müssen Sie auch sicher, PNGs sind 24-Bit, dh True Color, und nicht 8bit zu vermeiden Buggy Verhalten sein.

alten Thread, aber nur für den Fall - Dycey dem Beispiel sollte funktionieren, wenn Sie die Dinge richtig benennen. Hier ist eine modifizierte Version in meinem Ändern der Bildgröße Klasse verwendet. das Kontroll Beachten Sie, dass imagecolorallocatealpha zu machen () definiert ist, welche es nicht, wenn Sie GD verwenden wird <2.0.8

  /**
     * usually when people use PNGs, it's because they need alpha channel 
     * support (that means transparency kids). So here we jump through some 
     * hoops to create a big transparent rectangle which the resampled image 
     * will be copied on top of. This will prevent GD from using its default 
     * background, which is black, and almost never correct. Why GD doesn't do 
     * this automatically, is a good question.
     *
     * @param $w int width of target image
     * @param $h int height of target image
     * @return void
     * @private
     */
    function _preallocate_transparency($w, $h) {
        if (!empty($this->filetype) && !empty($this->new_img) && $this->filetype == 'image/png')) {
            if (function_exists('imagecolorallocatealpha')) {
                imagealphablending($this->new_img, false);
                imagesavealpha($this->new_img, true);
                $transparent = imagecolorallocatealpha($this->new_img, 255, 255, 255, 127);
                imagefilledrectangle($this->new_img, 0, 0, $tw, $th, $transparent);
            }
        }
    }

Es ist wahrscheinlich auf die neueren Versionen von PHP verwandt (I mit PHP 5.6 getestet), aber dies funktioniert nun ohne die Notwendigkeit, das Bild mit einem transparenten Hintergrund zu füllen:

$image_p = imagecreatetruecolor(480, 270);
imageAlphaBlending($image_p, false);
imageSaveAlpha($image_p, true);
$image = imagecreatefrompng('image_with_some_transaprency.png');
imagecopyresampled($image_p, $image, 0, 0, 0, 0, 480, 270, 1920, 1080);
imagepng($image_p, 'resized.png', 0);

Das ist auch nicht für mich arbeiten :( thisis meiner Lösung .. aber ich bekomme auch einen schwarzen Hintergrund und das Bild ist nicht transparent

    <?php
$img_id = 153;

$source = "images/".$img_id.".png";
$source = imagecreatefrompng($source);
$o_w = imagesx($source);
$o_h = imagesy($source);

$w = 200;
$h = 200;

$newImg = imagecreatetruecolor($w, $h);
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $w, $h, $transparent);
imagecopyresampled($newImg, $source, 0, 0, 0, 0, $w, $h, $o_w, $o_h);

imagepng($newImg, $img_id.".png");

?>
<img src="<?php echo $img_id.".png" ?>" />

Voll Beispiel. Beachten Sie, dass für einige PNG-Bilder im Internet findet es falsch funktioniert, aber für meine eigenen erstellt mit Photoshop es funktioniert gut.

    header('Content-Type: image/png');

$filename = "url to some image";

$newWidth = 300;
$newHeight = 300;

$imageInfo = getimagesize($filename);

$image = imagecreatefrompng($filename); //create source image resource
imagesavealpha($image, true); //saving transparency

$newImg = imagecreatetruecolor($newWidth, $newHeight); //creating conteiner for new image
imagealphablending($newImg, false);
imagesavealpha($newImg,true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127); //seting transparent background
imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent);
imagecopyresampled($newImg, $image, 0, 0, 0, 0, $newWidth, $newHeight,  $imageInfo[0], $imageInfo[1]);

imagepng($newImg); //printout image string

Hier vollständiger Code arbeitet für PNG-Dateien mit ihren Bildern Transparenz zu bewahren ..

list($width, $height) = getimagesize($filepath);
$new_width = "300";
$new_height = "100";

if($width>$new_width && $height>$new_height)
{
    $image_p = imagecreatetruecolor($new_width, $new_height);
    imagealphablending($image_p, false);
    imagesavealpha($image_p, true);
    $image = imagecreatefrompng($filepath);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagepng($image_p,$filepath,5);
}

Auch die obige Lösung funktionierte für mich. Dies ist die Art und Weise, was ich das Problem zu lösen, herausgefunden.

// upload directory
$upload_dir = "../uploads/";
// valid image formats
$valid_formats = array("jpg", "jpeg", "png");
// maximum image size 1 mb
$max_size = 1048576;
// crop image width, height
$nw = $nh = 800;
$nw1 = $nh1 = 400;
$nw3 = $nh3 = 200;
$nw2 = $nh2 = 100;
// checks that if upload_dir a directory/not
if (is_dir($upload_dir) && is_writeable($upload_dir)) {
    // not empty file
    if (!empty($_FILES['image'])) {
        // assign file name 
        $name = $_FILES['image']['name'];
        // $_FILES to execute all files within a loop
        if ($_FILES['image']['error'] == 4) {
            $message = "Empty FIle";
        }
        if ($_FILES['image']['error'] == 0) {
            if ($_FILES['image']['size'] > $max_size) {
                echo "E-Image is too large!<br>";
                $_SESSION['alert'] = "Image is too large!!";
            } else if (!in_array(pathinfo($name, PATHINFO_EXTENSION), $valid_formats)) {
                $_SESSION['alert'] = "This image is not a valid image format!!";
                echo "E-This image is not a valid image format<br>";
            } else if (file_exists($upload_dir . $name)) {
                $_SESSION['alert'] = "Image already exists!!";
                echo "E-Image already exists<br>";
            } else { // No error found! Move uploaded files 
                $size = getimagesize($_FILES['image']['tmp_name']);
                $x = (int) $_POST['x'];
                $y = (int) $_POST['y'];
                $w = (int) $_POST['w'] ? $_POST['w'] : $size[0];
                $h = (int) $_POST['h'] ? $_POST['h'] : $size[1];
                // path for big image
                $big_image_path = $upload_dir . "big/" . $name;
                // medium image path
                $medium_image_path = $upload_dir . "medium/" . $name;
                // small image path
                $small_image_path = $upload_dir . "small/" . $name;
                // check permission
                if (!is_dir($upload_dir . "big/") && !is_writeable($upload_dir . "big/")) {
                    mkdir($upload_dir . "big/", 0777, false);
                }
                if (!is_dir($upload_dir . "medium/") && !is_writeable($upload_dir . "medium/")) {
                    mkdir($upload_dir . "medium/", 0777, false);
                }
                if (!is_dir($upload_dir . "small/") && !is_writeable($upload_dir . "small/")) {
                    mkdir($upload_dir . "small/", 0777, false);
                }
                // image raw data from form
                $data = file_get_contents($_FILES["image"]["tmp_name"]);
                // create image
                $vImg = imagecreatefromstring($data);
                //create big image
                $dstImg = imagecreatetruecolor($nw, $nh);
                imagealphablending($dstImg, false);
                $trans_colour = imagecolorallocatealpha($dstImg, 0, 0, 0, 127);
                imagefilledrectangle($dstImg, 0, 0, $w, $h, $trans_colour);
                imagesavealpha($dstImg, true);
                imagecopyresampled($dstImg, $vImg, 0, 0, $x, $y, $nw, $nh, $w, $h);
                imagepng($dstImg, $big_image_path);
                //create medium thumb
                $dstImg1 = imagecreatetruecolor($nw1, $nh1);
                imagealphablending($dstImg1, false);
                $trans_colour1 = imagecolorallocatealpha($dstImg1, 0, 0, 0, 127);
                imagefilledrectangle($dstImg1, 0, 0, $w, $h, $trans_colour1);
                imagesavealpha($dstImg1, true);
                imagecopyresampled($dstImg1, $vImg, 0, 0, $x, $y, $nw1, $nh1, $w, $h);
                imagepng($dstImg1, $medium_image_path);
                // create smallest thumb
                $dstImg2 = imagecreatetruecolor($nw2, $nh2);
                imagealphablending($dstImg2, false);
                $trans_colour2 = imagecolorallocatealpha($dstImg2, 0, 0, 0, 127);
                imagefilledrectangle($dstImg2, 0, 0, $w, $h, $trans_colour2);
                imagesavealpha($dstImg2, true);
                imagecopyresampled($dstImg2, $vImg, 0, 0, $x, $y, $nw2, $nh2, $w, $h);
                imagepng($dstImg2, $small_image_path);
                /*
                 * Database insertion
                 */
                $sql = "INSERT INTO tbl_inksand_product_gallery ("
                        . "Product_Id,Gallery_Image_Big,Gallery_Image_Medium,Gallery_Image_Thumb,"
                        . "Gallery_Status,Created_By,Created_Datetime"
                        . ") VALUES ("
                        . "'{$Product_Id}','{$big_image_path}','{$medium_image_path}','{$small_image_path}',"
                        . "'A','$Created_By','{$time}'"
                        . ")";
                db_query($sql);
                if (db_affected_rows() == 1) {
                    if (imagedestroy($dstImg)) {
                        $_SESSION['success'] = "Image uploaded successfully.";
                        echo "S-Image uploaded successfully<br>";
                    } else {
                        $_SESSION['alert'] = "Image not uploaded!!";
                        echo "S-Image not uploaded";
                    }
                } else {
                    $_SESSION['alert'] = "Error in uploading image!!";
                    echo "E-Error in uploading image!!";
                }
            }
        }
    }
} else {
    mkdir($upload_dir, 0777);
}

mit Bildskalierung ist besser im Vergleich zu imagecopyresampled. Keine leere Bildressource für das skalierte Bild erforderlich ist, benötigt nur zwei Argumente im Vergleich zu den zehn geforderten imagecopyresampled. produziert auch eine bessere Qualität mit kleineren Größen. Bei der Verwendung von PHP 5.5.18 oder früher oder PHP 5.6.2 oder früher, sollten Sie die Höhe bereitzustellen, das das dritte Argument als das Seitenverhältnis Berechnung ist falsch.

$this->image =   imagecreatefrompng($filename);
$scaled = imagescale($this->image, $width);
imagealphablending($scaled, false);
imagesavealpha($scaled, true);
imagepng($scaled, $filename);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top