显示透明的BLOB .png

时间:2011-10-27 04:11:26

标签: php image blob

好的,所以我在谷歌搜索和阅读评论后改变了我的代码。

但是现在得到这个错误

  

警告:imagecopyresampled():提供的参数不是有效的Image资源   /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php on   第51行PNGIHDRâI¯警告:imagepng()[function.imagepng]:   gd-png:致命的libpng错误:zlib错误   /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php on   第54行

     

警告:imagepng()[function.imagepng]:gd-png错误:setjmp返回   错误情况   /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php on   第54行

     

警告:无法修改标头信息 - 已发送的标头   (输出始于   /home/realcas/public_html/eshop/ecms/system/classes/photofetch.php:51)   在/home/realcas/public_html/eshop/ecms/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 :(得分:0)

您不清楚自己遇到的问题是什么。提供有关问题的更多细节将有所帮助。

话虽如此,你的Content-Type标题是问题吗?在您的代码段中,您应该Content-Type: <span class="posthilit">image</span>/png时传递Content-Type: image/png

此外,在将图片发送给客户之前,您似乎正在销毁图片 - 请在致电imagedestory($im)后尝试移动imagepng($im, null, 300)

请务必检查您的返回值! imagecopyresampled可以在成功时返回true,在失败时返回false,这可以帮助您缩小失败的部分范围。

编辑:正如Korvin Szanto所说,您还需要将imagealphablending设置为true。

对更新的响应

您的新代码中注意到了一些事情:

  1. 您可以从$im创建变量imagecreatefromstring,但稍后在调用$img时使用imagecopyresampled
  2. 在致电imagecopyresampled时,您使用变量$w时应该是$x
  3. 请,开始检查您的返回值,而不是盲目地接受他们的工作。如果您在第一时间检查问题,可能会在imagecopyresampled发现问题。
  4. 您需要在输出图像本身之前输出标题 - 否则您将收到“标题已发送”错误。
  5. 您需要在返回之前移动imagedestroy 。一旦你的函数返回,它就不会执行 - 所以你的图像永远不会被破坏。此外,您还需要销毁原始PNG - 因此请在返回声明之前添加imagedestroy($im)