Img以二进制代码显示,浏览器上有正确的标题

时间:2013-07-02 10:45:59

标签: php image header gd

我构建了一类imgResize:

class imgResize
{
   public static function resizeAndOutput($img) {

    $orginal_img = $img;
    $width = 591;
    $height = 332;
    $new_width = 161;
    $new_height = 91;

    $edit_img = imagecreatetruecolor($new_width, $new_height);
    $image = imagecreatefromjpeg($orginal_img);
    imagecopyresampled($edit_img, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    header('Content-Type: image/jpeg');

    imagejpeg($edit_img);
}

}

并在html中我试着动态显示img

<img class="img_small" src="<?php imgResize::resizeAndOutput($img)">

只是得到这样的二进制数据:

�����JFIF���������>CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), default quality ���C�           $.' 

我如何解决我的问题?

4 个答案:

答案 0 :(得分:1)

你必须在数据uri中编码你的图像(并在你的html中将base64编码数据嵌入为字符串)并在php中删除那个header()行,

或创建指向该图片的链接,例如http://example.com/?myimage=id并按原样输出图像(如提供正确的标题并回显生成的图像)​​

告诉我您是否需要更多信息,或者这可以提供足够的见解。

答案 1 :(得分:0)

如果将其直接输出到src元素中,它当然只是HTML中的二进制垃圾。这不是<img>元素的工作方式。 <img>元素的src需要指向图片的网址。这可以是img/foo.jpgapp/some_script_that_outputs_an_image.phpData URI等网址。但不仅仅是二进制数据。输出图像的脚本将在第二种情况下工作,作为app/some_script_that_outputs_an_image.php链接的目标。

答案 2 :(得分:0)

你实际做得对,但在最后一部分你有问题。您必须保存图像,然后将图像的url返回到img元素。尝试以下代码:

class imgResize
{
   public static function resizeAndOutput($img) {

    $orginal_img = $img;
    $width = 591;
    $height = 332;
    $new_width = 161;
    $new_height = 91;

    $edit_img = imagecreatetruecolor($new_width, $new_height);
    $image = imagecreatefromjpeg($orginal_img);
    imagecopyresampled($edit_img, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    header('Content-Type: image/jpeg');

    //Now we have the image lets create a random filename
    //Modify this to your needs
    $filename = "images/IMG_" . mt_rand(1000,9999) . ".jpg";
    //Random sometimes sucks.. Lets see if we already got a file with that name
    //And if exists, loop until we get a unique one
    while(file_exists($filename)) {
        $filename = "images/IMG_" . mt_rand(1000,9999) . ".jpg";
    }
    //Now let's save the file
    imagejpeg($edit_img, $filename);
    //And finally return the file url
    return $filename;
}
}

如果您不想保存,则应将其直接输出到浏览器。您不需要任何img标记。这是因为在使用imagejpeg时,就像您在浏览器中直接打开了一个图像文件一样。 (我不知道我是否清楚。我只是想描述它到底是什么)

因此php文件将是相同的,你不需要任何HTML。只需调用该函数即可。它会做它所需要的:

imgResize::resizeAndOutput($img);

答案 3 :(得分:0)

class imgResize

{    public static function resizeAndOutput($ img){

$orginal_img = $img;
$width = 591;
$height = 332;
$new_width = 161;
$new_height = 91;

$edit_img = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($orginal_img);
imagecopyresampled($edit_img, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
ob_start ();
imagejpeg($edit_img);
$image_data = ob_get_contents ();
ob_end_clean ();
return base64_encode($image_data);

}

HTML

<img class="img_small" src="data:image/jpeg;base64,<?php echo imgResize::resizeAndOutput($img)">