Image komt heel raar [PHP]

Status
Niet open voor verdere reacties.

Daantje3

Gebruiker
Lid geworden
5 mei 2011
Berichten
428
Hallo iedereen,

ik maak een template voor minecraft server websites, en wil er een 'spelers online script' in hebben, graag met avatars.
Dus ik heb wat dingen gevonden, het werkt wel maar de output is verkeerd. ik krijg in plaats van een plaatje dit te zien:

Code:
�PNG  IHDR ��� IDATH�c,>��@|z����%�0���0�-`A�|{��fdD����g�x���������/��-�g� �o��ډUQx�����g�(ߌU}�8{�}�|y���߿���cæ|�-`L]�1������p6r�3� �����`3"�p s��C?�h�����o���e=3�s"����˃&!���AD߲�^e@�d��������^D$ ���"��r{�j��������`��~���Eʬ��IEND�B`�

De php code: Ik heb dus een werkend script. de plaatjes worden ook goed gemaakt. Maar de output is verkeerd. Ziet iemand waarom?

PHP:
<?php
     
    $user_minecraft = 'wide_load';
    $width = 32;
    $height = 32;
     
    $cache_file = "player_skins/{$Player}_{$width}x{$height}.png";
     
    if (!file_exists($cache_file) || time() - filemtime($cache_file) > 86400){
            $skin = imagecreatefromstring(file_get_contents("http://s3.amazonaws.com/MinecraftSkins/{$Player}.png"));
           
            $face = imagecreatetruecolor($width, $height);
           
            imagecopyresized($face, $skin, 0, 0, 8, 8, $width, $height, 8, 8);
            imagecopyresized($face, $skin, 0, 0, 40, 8, $width, $height, 8, 8);
           
            imagepng($face, $cache_file);
    }
     
    readfile($cache_file);
?><?php echo htmlspecialchars( $Player ); ?>
 
Lijkt me nogal duidelijk: Je schrijft de binaire inhoud van het .png bestand naar de gebruiker, ipv. het .png bestand correct in de browser te laten openen en tonen.
Je moet minstens het mime-type toevoegen!
Kijk eens hier

Mogelijk is het al genoeg (maar met meer/extra headertypes kun je nog meer sturen) als je het png mime-type toevoegt door
PHP:
header('Content-Type: image/png');
te zetten voor de regel
readfile($cache_file);

En verder las ik nog wat over flushing, dus ik zou het volgende proberen als vervanger van regel 20:

PHP:
header('Content-Type: image/png');
ob_clean();
flush();
readfile($cache_file);

Tijs.
 
Laatst bewerkt:
Werkt helaas niet. Code:

PHP:
<?php
	// Edit this ->
	define( 'MQ_SERVER_ADDR', '178.238.230.59' );
	define( 'MQ_SERVER_PORT', 25677 );
	define( 'MQ_TIMEOUT', 1 );
	// Edit this <-
	
	// Display everything in browser, because some people can't look in logs for errors
	Error_Reporting( E_ALL | E_STRICT );
	Ini_Set( 'display_errors', true );
	
	require __DIR__ . '/MinecraftQuery.class.php';
	
	$Timer = MicroTime( true );
	
	$Query = new MinecraftQuery( );
	
	try
	{
		$Query->Connect( MQ_SERVER_ADDR, MQ_SERVER_PORT, MQ_TIMEOUT );
	}
	catch( MinecraftQueryException $e )
	{
		$Exception = $e;
	}
	
	$Timer = Number_Format( MicroTime( true ) - $Timer, 4, '.', '' );
?>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>Minecraft Query PHP Class</title>
	<style type="text/css">
		.jumbotron {
			margin-top: 30px;
			border-radius: 0;
		}
		
		.table thead th {
			background-color: #428BCA;
			border-color: #428BCA !important;
			color: #FFF;
		}
	</style>
</head>

<body>
			<div class="col-sm-6">
				<table class="table table-bordered table-striped">
					<thead>
						<tr>
							<th>Players</th>
						</tr>
					</thead>
					<tbody>
<?php if( ( $Players = $Query->GetPlayers( ) ) !== false ): ?>
<?php foreach( $Players as $Player ): ?>
						<tr>
							<td><?php
     
    $user_minecraft = 'wide_load';
    $width = 32;
    $height = 32;
    $cache_file = "player_skins/{$Player}_{$width}x{$height}.png";
     
    if (!file_exists($cache_file) || time() - filemtime($cache_file) > 86400){
            $skin = imagecreatefromstring(file_get_contents("http://s3.amazonaws.com/MinecraftSkins/{$Player}.png"));
           
            $face = imagecreatetruecolor($width, $height);
           
            imagecopyresized($face, $skin, 0, 0, 8, 8, $width, $height, 8, 8);
            imagecopyresized($face, $skin, 0, 0, 40, 8, $width, $height, 8, 8);
           
            imagepng($face, $cache_file);
    }
	
header('Content-Type: image/png');
ob_clean();
flush();
readfile($cache_file);
?></td>
						</tr>
<?php endforeach; ?>
<?php else: ?>
						<tr>
							<td>No players in da house</td>
						</tr>
<?php endif; ?>
					</tbody>
				</table>
			</div>
		</div>
	</div>
</body>
</html>

Foutmelding:

Warning: Cannot modify header information - headers already sent by (output started at /home/<knip>/domains/<knip>/public_html/mc/index.php:57) in /home/<knip>/domains/<knip>/public_html/mc/index.php on line 78
 
Laatst bewerkt:
Warning: Cannot modify header information - headers already sent

En als je die opzoekt in google dan zie je dat het een bijzonder simpel probleem is met en even simpele oplossing.

Wat je nu doet met die img tag is niet aan te raden, je versplit een hele hoop CPU resources voor het maken van een enkel plaatje, dit zal je hoster niet leuk vinden.
 
PHP:
<img src="http://achievecraft.com/tools/avatar/32/<?=$Player?>.png" />
:D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan