1

我正在拍摄链接图像,并使用 imagecopyresampled() 制作我自己调整大小的版本。

当尝试显示 GD 库重采样图像时,低于特定尺寸(大约 160 像素宽度)的图像仅显示为一堆乱码(例如:'����JFIF��>CREATOR: gd-jpeg v1.0(使用 IJG JPEG v62),默认质量 ��C')。

我自己检查了图像,它们被很好地存储并在图片查看器中打开时正确显示。但是,将它们打印到浏览器是行不通的。当我将像素大小更改为更大的像素大小时,它工作正常。

我正在像这样在浏览器中显示图像

$handle = fopen($fileName, "rb");
$img = fread($handle, filesize($fileName));
fclose($handle);
$imgSize = strlen($img);
$image_type = exif_imagetype($fileName);
header('Content-Type: image/JPEG');
header('Content-Transfer-Encoding: binary');
header("Content-Length: $imgSize");
print $img;
return true;

现在我开始相信这与 GD 库有关。其他人对此有任何进一步的了解吗?

谢谢。

编辑:

布拉德的一项建议向我展示了正确的方法。像往常一样,这是一个完全愚蠢的错误。我还不能回答我自己的问题,所以我想我会进行编辑。

我在最初的描述中忘记包含的是,之前的代码都在我的一个模型中,然后我调用了一个函数来在我的控制器中显示图像。

我最近切换到 Symfony2,并且在我的控制器中几乎所有地方都使用了响应返回。然而,我一直在重用我的旧节目图像代码,它是在没有 Symfony 的情况下编写的。我有一个“显示图像”类型的函数,我在控制器中调用它,然后返回一个空响应。因此,Symfony 的响应返回弄乱了编码。高级浏览器能够自动校正大图像,但不能自动校正小图像。

我的最终解决方案变成了

在我的模型中

$handle = fopen($fileName, "rb");
$image= fread($handle, filesize($fileName));
fclose($handle);
$image_type = exif_imagetype($fileName);

在我的控制器中

return new Response($image, 200, array('Content-Type' => $image_type));
4

2 回答 2

1

您看到的是原始图像数据,这意味着浏览器由于某种原因没有注册内容类型。

Content-Type我怀疑正在发生的事情是,您正在测试的任何浏览器都对标头区分大小写。

更改image/JPEGimage/jpeg,看看是否适合您。

至于为什么它适用于更大的图像的解释......很可能Content-Type永远不会被识别为已知类型。浏览器会查看他们收到的实际内容,试图找出它是什么类型。它的内容嗅探功能中可能有一些东西,它看起来很短,然后说:“不,可能不是图像”,然后继续前进。

于 2012-04-17T13:28:35.387 回答
1

它们有很多方法可以实现工作脚本..我给你2个例子,使用 file_get_contentsread_file

示例 1 使用file_get_contents

$fileName = "http://www.bestmastersineducation.com/teaching-to-tests/standardized-tests.jpg"; // Full path to image
$img = file_get_contents($fileName);
$imgSize = strlen($img);
header('Content-Type: image/jpeg');
header ('Content-Transfer-Encoding: binary' );
header ("Content-Length: $imgSize" );
echo $img;
return true;

查看演示:http ://codepad.viper-7.com/GFqsLe

现在创建一个较小的图像样本

header ( 'Content-Type: image/jpeg' );
header ( 'Content-Transfer-Encoding: binary' );

$new_width = 100;
$new_height = 100;

$fileName = "http://www.bestmastersineducation.com/teaching-to-tests/standardized-tests.jpg"; // 
$img = file_get_contents ( $fileName );
$im = imagecreatefromstring ( $img );
if ($im !== false) {
    list ( $width, $height ) = getimagesize ( $fileName );
    $imageSample = imagecreatetruecolor ( $new_width, $new_height ); // new                                                    // Height
    imagecopyresampled ( $imageSample, $im, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
    imagejpeg ( $imageSample, null, 100 );
}

演示链接:http ://codepad.viper-7.com/gXmoDW

示例 2使用readfile

$fileName = "a.jpg" ;   //Full path to image
$imgSize = filesize($fileName);
$imageType = exif_imagetype($fileName);
header('Content-Type:' . image_type_to_mime_type ($imageType));
header('Content-Transfer-Encoding: binary');
header("Content-Length: $imgSize");
readfile($fileName);

选修的

如果您想强制下载,请改用它

$fileName = "a.jpg" ; //Full path to image 
$imgSize = filesize($fileName);
$imageType = exif_imagetype($fileName);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fileName));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header("Content-Length: $imgSize");
readfile($fileName);

我希望这有帮助

于 2012-04-17T13:37:58.607 回答