我正在拍摄链接图像,并使用 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));