Zoeken…


Opmerkingen

Bij gebruik van header("Content-Type: $mimeType"); en image____ om alleen een afbeelding naar de uitvoer te genereren, zorg ervoor dat u niets anders uitvoert, let op zelfs een lege regel na ?> . (Dat kan een moeilijke 'bug' zijn om op te sporen - u krijgt geen beeld en geen idee waarom.) Het algemene advies is om hier helemaal geen?> Op te nemen.

Een afbeelding maken

Gebruik de functie imagecreatetruecolor om een lege afbeelding te maken:

$img = imagecreatetruecolor($width, $height);

$img is nu een bronvariabele voor een afbeeldingsbron met $width x $height pixels. Merk op dat de breedte van links naar rechts telt en de hoogte van boven naar beneden.

Afbeeldingsbronnen kunnen ook worden gemaakt op basis van functies voor het maken van afbeeldingen , zoals:

  • imagecreatefrompng
  • imagecreatefromjpeg
  • andere imagecreatefrom* functies.

Afbeeldingsbronnen kunnen later worden vrijgegeven als er geen verwijzingen meer naar zijn. Als u echter onmiddellijk geheugen wilt vrijmaken (dit kan belangrijk zijn als u veel grote afbeeldingen verwerkt), is het een goede gewoonte om imagedestroy() op een afbeelding te gebruiken wanneer deze niet meer wordt gebruikt.

imagedestroy($image);

Een afbeelding converteren

Afbeeldingen die door beeldconversie zijn gemaakt, wijzigen de afbeelding pas wanneer u deze uitvoert. Daarom kan een afbeeldingconvertor zo eenvoudig zijn als drie coderegels:

function convertJpegToPng(string $filename, string $outputFile) {
    $im = imagecreatefromjpeg($filename);
    imagepng($im, $outputFile);
    imagedestroy($im);
}

Afbeelding output

Een afbeelding kan worden gemaakt met behulp van de image* , waarbij * de bestandsindeling is.

Ze hebben deze syntaxis gemeen:

bool image___(resource $im [, mixed $to [ other parameters]] )

Opslaan in een bestand

Als u de afbeelding in een bestand wilt opslaan, kunt u de bestandsnaam of een geopende bestandsstream doorgeven als $to . Als u een stream doorgeeft, hoeft u deze niet te sluiten, omdat GD deze automatisch sluit.

Om bijvoorbeeld een PNG-bestand op te slaan:

imagepng($image, "/path/to/target/file.png");

$stream = fopen("phar://path/to/target.phar/file.png", "wb");
imagepng($image2, $stream);
// Don't fclose($stream)

Wanneer u fopen , zorg er dan voor dat u de vlag b plaats van de vlag t , omdat het bestand een binaire uitvoer is.

Probeer niet te passeren fopen("php://temp", $f) of fopen("php://memory", $f) aan. Omdat de stream na de oproep wordt afgesloten door de functie, kunt u deze niet verder gebruiken, bijvoorbeeld om de inhoud op te halen.

Uitvoer als HTTP-reactie

Als u deze afbeelding direct wilt retourneren als de reactie van de afbeelding (bijvoorbeeld om dynamische badges te maken), hoeft u niets door te geven (of null ) als het tweede argument. In het HTTP-antwoord moet u echter uw inhoudstype opgeven:

header("Content-Type: $mimeType");

$mimeType is het MIME-type van het formaat dat u retourneert. Voorbeelden zijn image/png , image/gif en image/jpeg .

In een variabele schrijven

Er zijn twee manieren om in een variabele te schrijven.

OB gebruiken (outputbuffering)

ob_start();
imagepng($image, null, $quality); // pass null to supposedly write to stdout
$binary = ob_get_clean();

Stream-wrappers gebruiken

Mogelijk hebt u veel redenen waarom u geen uitvoerbuffering wilt gebruiken. Mogelijk hebt u bijvoorbeeld al een OB aan. Daarom is een alternatief nodig.

Met de stream_wrapper_register functie kan een nieuwe stream_wrapper_register worden geregistreerd. Daarom kunt u een stream doorgeven aan de functie voor beelduitvoer en deze later ophalen.

<?php

class GlobalStream{
        private $var;

        public function stream_open(string $path){
                $this->var =& $GLOBALS[parse_url($path)["host"]];
                return true;
        }

        public function stream_write(string $data){
                $this->var .= $data;
                return strlen($data);
        }
}

stream_wrapper_register("global", GlobalStream::class);

$image = imagecreatetruecolor(100, 100);
imagefill($image, 0, 0, imagecolorallocate($image, 0, 0, 0));

$stream = fopen("global://myImage", "");
imagepng($image, $stream);
echo base64_encode($myImage);

In dit voorbeeld schrijft de klasse GlobalStream elke invoer in de referentievariabele (dwz indirect schrijven naar de globale variabele van de opgegeven naam). De globale variabele kan later direct worden opgehaald.

Er zijn enkele speciale dingen om op te merken:

  • Een volledig geïmplementeerd stroom wrapper klasse eruit moet zien dit , maar volgens tests met het __call magische methode, alleen stream_open , stream_write en stream_close worden opgeroepen uit interne functies.
  • Er zijn geen vlaggen vereist in de fopen aanroep, maar u moet op zijn minst een lege string doorgeven. Dit komt omdat de fopen functie een dergelijke parameter verwacht, en zelfs als u deze niet gebruikt in uw stream_open implementatie, is er nog een dummy vereist.
  • Volgens tests wordt stream_write meerdere keren genoemd. Vergeet niet om .= (Aaneenschakelingstoewijzing) te gebruiken, niet = (toewijzing van directe variabele).

Voorbeeld gebruik

In de <img> HTML-tag kan een afbeelding rechtstreeks worden aangeleverd in plaats van een externe link te gebruiken:

echo '<img src="data:image/png;base64,' . base64_encode($binary) . '">';

Afbeelding bijsnijden en vergroten / verkleinen

Als u een afbeelding hebt en een nieuwe afbeelding met nieuwe dimensies wilt maken, kunt u de functie imagecopyresampled gebruiken:

maak eerst een nieuwe image met de gewenste afmetingen:

// new image
$dst_img = imagecreatetruecolor($width, $height);

en sla de originele afbeelding op in een variabele. Om dit te doen, kunt u een van de createimagefrom* -functies gebruiken waar * staat voor:

  • jpeg
  • gif
  • png
  • draad

Bijvoorbeeld:

//original image
$src_img=imagecreatefromstring(file_get_contents($original_image_path));

Kopieer nu alle (of een deel van) de originele afbeelding (src_img) naar de nieuwe afbeelding (dst_img) door imagecopyresampled :

imagecopyresampled($dst_img, $src_img, 
    $dst_x ,$dst_y, $src_x, $src_y, 
    $dst_width, $dst_height, $src_width, $src_height);

Gebruik de onderstaande afbeelding om de dimensies src_* en dst_* te stellen:

voer hier de afbeeldingsbeschrijving in

Als u nu de volledige bronafbeelding (eerste afbeelding) naar de gehele doelzone wilt kopiëren (niet bijsnijden):

$src_x = $src_y = $dst_x = $dst_y = 0;
$dst_width = $width;// width of new image
$dst_height = $height; //height of new image
$src_width = imagesx($src_img); //width of initial image
$src_height = imagesy($src_img); //height of initial image


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow