1

リンクされた画像を取得し、imagecopyresampled() を使用してサイズを変更した独自のバージョンを作成しています。

GD ライブラリのリサンプル画像を表示しようとすると、特定のサイズ (幅約 160px) 未満の画像は意味のないものの束としてのみ表示されます (例: '����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ライブラリと関係があると信じ始めています。他の誰かがこれについてさらに洞察を持っていますか?

ありがとう。

編集:

Brad の提案の 1 つが正しい方法を示してくれました。いつものように、それは完全に骨の折れる間違いでした。自分の質問にはまだ答えられないので、代わりに編集することにしました。

最初の説明に含めるのを忘れていたのは、前のコードはすべてモデルの 1 つにあり、コントローラーで画像を表示する関数を呼び出したことです。

私は最近 Symfony2 に切り替え、コントローラーのいたるところで Response リターンを使用しています。しかし、私は Symfony を使わずに書かれた古いショー画像コードを再利用していました。「画像を表示」タイプの関数をコントローラーで呼び出してから、空の応答を返しました。したがって、Symfony の Response リターンはエンコーディングを台無しにしました。高度なブラウザは、大きな画像は自動修正できましたが、小さな画像は自動修正できませんでした。

私の最終的な解決策は

私のモデルでは

$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

それらは、機能するスクリプトを実現するための非常に多くの方法です.. と を使用 file_get_contentsした2つの例を示しますread_file

使用例1file_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 に答える