0

これを行うことで、ユーザーがアップロードした画像がpngの場合、最終的に透過性を維持することができました:

    $image_p = imagecreatetruecolor($fixed_width, $fixed_height);

    if ($_FILES[$fileName]["type"] == "image/x-png" || $_FILES[$fileName]["type"] == "image/png") {

        $background = imagecolorallocate($image_p, 0, 0, 0);
        imagecolortransparent($image_p, $background);
        imagealphablending($image_p, false);
        imagesavealpha($image_p, true);
    }

    // PNG or JPG
    if ($_FILES[$fileName]["type"] == "image/jpeg" || $_FILES[$fileName]["type"] == "image/jpg" || $_FILES[$fileName]["type"] == "image/pjpeg") {
        $image = imagecreatefromjpeg($imageFile);
    } else {
        $image = imagecreatefrompng($imageFile);
    }


    // check if img is bigger then max width
    $manipulated = 0;

    if ($width_orig > $fixed_width) {
        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $fixed_width, $fixed_height, $width_orig, $height_orig); // reduce in width / height
        $manipulated = 1;
    } else {
        $image_p = $image; // leave as is
    }

    // Output PNG or JPG
    if ($_FILES[$fileName]["type"] == "image/jpeg" || $_FILES[$fileName]["type"] == "image/jpg" || $_FILES[$fileName]["type"] == "image/pjpeg") {
        imagejpeg($image_p, $newfile, 65);
    } else {
        imagepng($image_p, $newfile, 6);
    }

しかし、今ではそれらを .png として表示する際に問題があります。Cpanel 辞書からファイルを開くと透明になりますが、次のように表示すると:

<?php

$file = basename(urldecode($_GET['img']));
$file = str_replace("../", "", $file); 

$fileDir = '/home/funkydic/noaccess/avatars/';

$jpg = strpos($file, '.jpg');
$jpeg = strpos($file, '.jpeg');
$png = strpos($file, '.png');

if ($jpg != false || $jpeg != false) {

    if (file_exists($fileDir . $file)) {

        $imageRes = imagecreatefromjpeg($fileDir . $file);
        header('Content-Type: image/jpeg');
        // Output the image
        @imagepng($imageRes);
        // Free up memory
        @imagedestroy($imageRes);
        die();
    }
}
elseif ($png != false) {

    if (file_exists($fileDir . $file)) {


        $imageRes = imagecreatefrompng($fileDir . $file);

        header('Content-Type: image/png');
        // Output the image
        @imagepng($imageRes);
        // Free up memory
        @imagedestroy($imageRes);
        die();
    }
}
?>

透明な領域で、ブラック ボックスが戻ります。

4

1 に答える 1

0

ブラウザーに送信するだけの PNG が既にある場合は、そのために GD は必要ありません。

header('Content-Type: image/png');
fp = fopen($fileDir . $file, "r");
fpassthru($fp);
fclose($fp); /* this is not necessary, but I prefer to keep it */
exit();

JPEGを同じ方法でエクスポートするので(ところで、その部分にエラーがあります:ヘッダーが言っimage/jpegていて、PNGを送信しています@imagepng())、私はあなたのコードを次のように書き直します:

<?php

$allowedMimes = array("png", "gif", "jpeg");
$fileDir = '/home/funkydic/noaccess/avatars/';

$file = basename(urldecode($_GET['img']));
$file = str_replace("../", "", $file); /* what's this for? you already have basename() */

if (file_exists($fileDir . $file)) {
    $mime = strtolow(pathinfo($file, PATHINFO_EXTENSION));
    if ($mime == "jpg") $mime = "jpeg";

    if (in_array($mime, $allowedMimes)) {
        header("Content-Type: image/$mime");
        fp = fopen($fileDir . $file, "r");
        fpassthru($fp);
        fclose($fp);
        exit();
    }
    /* if you get here, extension in the GET request was wrong */
}
/* if you get here, extension in the GET request was wrong or the file doesn't exist */
?>
于 2013-05-15T22:48:49.807 に答える