Sí, antes de enviar la salida de la imagen tenés que enviar los headers correspondientes al tipo de imagen.
header("Content-type: image/png"); // Creo que era algo como esto.

Si de hecho el código que utilizo es este:
<?
$im = imagecreate(100, 100) or die("Error creando la imagen");
$fondo = imagecolorallocate($im, 255, 255, 255); // blanco
$linea = imagecolorallocate($im, 0, 0, 0); // negro
// Dibujamos la línea
imageline($im, 10, 10, 90, 90, $linea);
header("content-type: image/png");
imagepng($im);
imagedestroy($im);
?>
Incluso tengo otro archivo donde mando a llamar este script(linea.php), así:
<body>
<img src="linea.php">
</body>
y en este caso pone el cuadrito con la cruz roja, de que no encuentra la imagen.