2015-07-18 5 views
0

Я пытаюсь использовать функции класса ImageMagick в PHP. Чтобы познакомиться с ImageMagick, я написал несколько строк кода в PHP, чтобы отобразить красный квадрат в моем браузере.ImageMagick отображает искаженный текст вместо изображения

Вместо того, чтобы отображать красный квадрат, я получаю искаженный текст. Я знаю, что ImageMagick установлен, потому что я могу использовать функции ImageMagick для сохранения красного квадрата в файл.

Заранее благодарим за помощь для этого новичка в ImageMagick и StackOverflow!

Вот мой PHP код:

$image = new Imagick(); 
$image->newImage(100, 100, new ImagickPixel('red')); 
$image->setImageFormat('png'); 
$image->writeImage("MyOutput.png"); 

header('Content-type: image/png'); 
echo $image; //This causes just raw text to be displayed. :(

echo '<img src=MyOutput.png>'; //Displays a 100x100 red image! 
           //..So, ImageMagick IS installed. 

Вот мой полный PHP файл.

<!DOCTYPE html> 
<head> 
    <title>ImageMagick Test</title> 
</head> 
<body> 
<?php 

$image = new Imagick(); 
$image->newImage(100, 100, new ImagickPixel('red')); 
$image->setImageFormat('png'); 

header('Content-type: image/png'); 
echo $image; 
?> 

</body> 
</html> 

ответ

1

Основная проблема заключается в том, что вы отправляете Content-Type: image/png после ввода некоторого выхода. После того, как вы добавили какой-либо вывод, PHP немедленно отправляет все заголовки ответов и переходит к основной части ответа. Значение по умолчанию Content-Type равно text/html на большинстве серверов, поэтому ваш браузер интерпретирует контент изображения как HTML, и именно поэтому вы видите мусор. Это немного похоже на открытие PNG-файла в блокноте.

See this question for more information about sending response headers

Кроме того, вы не можете вернуть HTML и содержимое изображения на один запрос, поэтому не помещаете HTML в файле изображения генерирующим. Изображение является независимым файлом, и его нужно вернуть по собственному отдельному запросу, содержащему только заголовки, байты изображения и ничего больше.

Это должно работать:

<?php 
$image = new Imagick(); 
$image->newImage(100, 100, new ImagickPixel('red')); 
$image->setImageFormat('png'); 

header('Content-type: image/png'); 
echo $image; 

Обратите внимание, что это весь PHP файл, и вы не можете отправить любой другой выход ни снаружи, ни <?php ?> вторя.

Если вы хотите включить изображение в HTML вам нужен второй файл (это может быть простой HTML), который должен выглядеть следующим образом:

<!DOCTYPE html> 
<head> 
    <title>ImageMagick Test</title> 
</head> 
<body> 
    <!-- here we're including our image-generating PHP script --> 
    <img src="imagickTest.php"> 
</body> 
</html> 

Тогда вы можете обратиться либо в PHP файл, если вы хотите чтобы увидеть только изображение или файл HTML, если вы хотите увидеть изображение, помещенное в контекст HTML.

+0

Это не сработало. Вот мой PHP-файл. Он по-прежнему отображается искаженный текст вместо изображения: ' ImageMagick Test newImage (100, 100, новый ImagickPixel ('красный')); $ image-> setImageFormat ('png'); header ('Content-type: image/png'); echo $ image; ?> ' – RobertH

+0

@RobertH, см. Мой обновленный ответ. – pamelus

+0

Это сработало! Спасибо, что нашли время, чтобы дать мне подробное объяснение, pamelus. Я очень ценю это! – RobertH