Показать прозрачный BLOB .png - PullRequest
1 голос
/ 27 октября 2011

Хорошо, поэтому я изменил свой код после небольшого поиска в Google и чтения комментариев.

Но теперь получаю эту ошибку

Предупреждение: imagecopyresampled (): предоставленный аргумент недопустимРесурс изображения в /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php в строке 51. Предупреждение PNG: imagepng () [function.imagepng]: gd-png: фатальная ошибка libpng: zlibошибка в /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php в строке 54

Предупреждение: imagepng () [function.imagepng]: gd-png error: setjmp возвращает условие ошибки в/home/realcas/public_html/eshop/ecms/system/classes/photofetch.php в строке 54

Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался в / home / realcas / public_html / eshop/ecms/system/classes/photofetch.php:51) в /home/realcas/public_html/eshop/ecms/sms/system/classes/photofetch.php в строке 55

Вот новый код

<?
include_once('database.php');



//Fetch basic Profile
class fetchphoto extends Database{


        public function countrysize($id){
        $this->id = $id;
            $array=preg_split('#(?<!\\\)\:#',$this->id); 

            if($array[1] == "9177156176671")
            {
            $max_width = 226;

            $max_height = 3000;
            }
             $sth = mysql_query("SELECT categoryimage FROM shop_categories WHERE id = '".$array[0]."'");

                while($r = mysql_fetch_assoc($sth)) {
                $blobcontents = $r["categoryimage"];

                $im = imagecreatefromstring($blobcontents);

                $x = imagesx($im);
                $y = imagesy($im);

                $ratioh = $max_height/$y;
                $ratiow = $max_width/$x;
                $ratio = min($ratioh, $ratiow);
                // New dimensions
                $width = intval($ratio*$x);
                $height = intval($ratio*$y);







                 // Temporarily increase the memory limit to allow for larger images
                ini_set('memory_limit', '32M'); 


            // create a new blank image
            $newImage = imagecreatetruecolor($width, $height);

            // Copy the old image to the new image
            imagecopyresampled($newImage, $img, 0, 0, 0, 0, $width, $height, $w, $y);

            // Output to a temp file
            imagepng($newImage, null, 10);  
            header('Content-type: image/png');
            return $newImage;

            // Free memory                           
            imagedestroy($newImage);
            }


    }



}

$fetchpicture = new fetchphoto();
$fetchpicture->Connect();
$fetchpicture->DB();
$fetchpicture->countrysize($_GET['pic']);
$fetchpicture->CloseDB();
?>

1 Ответ

0 голосов
/ 27 октября 2011

Вы не совсем понимаете, с какими проблемами вы сталкиваетесь.Предоставление более подробной информации о проблеме поможет.

Как говорится, является ли проблема вашим заголовком Content-Type?В вашем фрагменте кода вы передаете Content-Type: <span class="posthilit">image</span>/png, когда оно должно быть Content-Type: image/png.

Кроме того, похоже, что вы уничтожаете изображение, прежде чем отправить его клиенту - попробуйте переместить imagedestory($im) после того, как вызвоните imagepng($im, null, 300).

Не забудьте проверить ваши возвращаемые значения тоже!imagecopyresampled может вернуть true при успехе и false при ошибке, что может помочь вам сузить часть, которая выходит из строя.

РЕДАКТИРОВАТЬ : Как сказал Корвин Санто, вы такжехотите установить imagealphablending в true.

Ответ на обновление

В вашем новом коде замечено несколько вещей:

  1. Вы создаете переменную$im из imagecreatefromstring, но позже вы используете $img при вызове imagecopyresampled.
  2. При вызове imagecopyresampled вы используете переменную $w, когда она должна быть $x.
  3. Пожалуйста, пожалуйста, , пожалуйста начните проверять возвращаемые значения вместо того, чтобы слепо признать, что они работают.Возможно, вам удалось обнаружить проблему на imagecopyresampled, если вы проверяли их в первую очередь.
  4. Вам нужно вывести свой заголовок до того, как вы выведете само изображение - иначе выВы получите ошибку «заголовки уже отправлены».
  5. Вам нужно переместить imagedestroy до возврата.Как только ваша функция вернется, ничего после нее не выполнится, поэтому ваше изображение никогда не будет уничтожено.Кроме того, вам также нужно будет уничтожить исходный PNG - так что добавьте imagedestroy($im) перед вашим оператором возврата.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...