Почему PHP отображает это изображение неправильно? - PullRequest
0 голосов
/ 06 августа 2011

Я пытаюсь взять изображение (.gif, .jpg или .png) и вывести его в формате .png

Это код, который я использую:

<?php
$filename = urlencode($_FILES['uploadfile']['name']);

$size = getimagesize($tempname);

switch($size["mime"]){

    case "image/jpeg":
        $img = imagecreatefromjpeg($tempname); //jpeg file
    break;

    case "image/gif":
        $img = imagecreatefromgif($tempname); //gif file
    break;

    case "image/png":   
        $img = imagecreatefrompng($tempname); //png file
    break;

    default: 
        die('Unknown filetype');
    break;
}

ob_start();
imagepng($img);
$content = ob_get_contents();
ob_end_clean();
?>

Проблема заключается в том, что когда я ввожу это, например: http://i52.tinypic.com/dzglmu.png

Вывод становится таким: http://i53.tinypic.com/15fg8w5.png

Может кто-нибудь сказать мне, что здесь происходит неправильно?

1 Ответ

2 голосов
/ 06 августа 2011

ну, это не так просто. PNG и GIF несут информацию об альфа-уровне, который может быть потерян (и, следовательно, представлен в другом цвете). Кроме того, как сказал @hakre, тип mime, предоставляемый браузерами, не является действительно достоверной информацией. И ваши MIME не являются полными, так как есть другие возможности: например, у меня возникли некоторые проблемы с IE8, потому что он назначил MIME 'image / x-png' вместо обычного 'image / png', и это может легко сломать вашу функциональность. Хороший надежный способ получения MIME (и оценки, если изображение действительно является изображением, что является важным шагом!) Использует getimagesize () function

$size = getimagesize($file);
$mime = $size['mime'];

getimagesize() возвращает массив с 4 индексами, I.E.:

  1. Индекс 0 - это ширина изображения в пикселях.
  2. Индекс 1 - это высота изображения в пикселях.
  3. Индекс 2 является флагом для типа изображения:

    1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF (orden de bytes intel), 8 = TIFF (orden de bytes motorola), 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM.

  4. Индекс 3 содержит 'height = "yyy" width = "xxx"'

Я взял вышеприведенное резюме со страницы руководства, на которую я ссылался, но вы можете легко проверить это самостоятельно, я просто ленился.

Вам нужно добавить хотя бы PNG:

imagealphablending($img, true); // setting alpha blending on
imagesavealpha($img, true); // save alphablending setting 

Но поищите более полный пример в руководстве или обратитесь к нему за Google, так как это были только предположения, вам нужно адаптировать ситуацию к степени, в которой вам нужно обрабатывать ваше изображение.

...