Sök…


Anmärkningar

När du använder header("Content-Type: $mimeType"); och image____ att generera endast en bild till utgången, se till att inte mata ut något annat, notera även en tom rad efter ?> . (Det kan vara ett svårt "fel" att spåra - du får ingen bild och ingen aning om varför.) Det allmänna rådet är att inte inkludera?> Alls här.

Skapa en bild

För att skapa en tom bild använder du imagecreatetruecolor funktionen:

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

$img är nu en resursvariabel för en bildresurs med $width x $height höjdpixel. Observera att bredden räknas från vänster till höger och höjden räknas från topp till botten.

Bildresurser kan också skapas från bildskapningsfunktioner , till exempel:

  • imagecreatefrompng
  • imagecreatefromjpeg
  • andra imagecreatefrom* funktioner.

Bildresurser kan frigöras senare när det inte finns fler referenser till dem. Att frigöra minnet omedelbart (detta kan vara viktigt om du bearbetar många stora bilder) kan dock vara bra att använda imagedestroy() på en bild när den inte längre används.

imagedestroy($image);

Konvertera en bild

Bilder som skapas genom bildkonvertering ändrar inte bilden förrän du matar ut den. Därför kan en bildkonverterare vara så enkel som tre kodrader:

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

Bildutgång

En bild kan skapas med hjälp av image* , där * är filformatet.

De har denna syntax gemensamt:

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

Sparar till en fil

Om du vill spara bilden i en fil kan du skicka filnamnet eller en öppnad filström som $to . Om du passerar en ström behöver du inte stänga den, eftersom GD stänger den automatiskt.

Så här sparar du till exempel en PNG-fil:

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

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

När du använder fopen , se till att använda b flaggan snarare än t flaggan, eftersom filen är en binär utgång.

Försök inte skicka fopen("php://temp", $f) eller fopen("php://memory", $f) till det. Eftersom strömmen stängs av funktionen efter samtalet kan du inte använda den ytterligare, till exempel att hämta innehållet.

Utdata som ett HTTP-svar

Om du vill returnera den här bilden direkt som svaret på bilden (t.ex. för att skapa dynamiska märken) behöver du inte skicka något (eller skicka null ) som det andra argumentet. I HTTP-svaret måste du dock ange din innehållstyp:

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

$mimeType är MIME-typen av det format du returnerar. Exempel inkluderar image/png , image/gif och image/jpeg .

Skriva in i en variabel

Det finns två sätt att skriva in i en variabel.

Använda OB (Output Buffering)

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

Använd strömbrytare

Du kan ha många orsaker till att du inte vill använda utgångsbuffert. Till exempel kanske du redan har OB på. Därför behövs ett alternativ.

Med hjälp av funktionen stream_wrapper_register kan en ny strömbrytare registreras. Därför kan du skicka en ström till bildutgångsfunktionen och hämta den senare.

<?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);

I det här exemplet skriver GlobalStream klassen alla inmatningar i referensvariabeln (dvs. indirekt skriva till den globala variabeln för det givna namnet). Den globala variabeln kan senare hämtas direkt.

Det finns några speciella saker att notera:

  • En fullständigt implementerad strömbrytarklass ska se ut så här , men enligt test med __call magi-metoden stream_open endast stream_open , stream_write och stream_close från interna funktioner.
  • Inga flaggor krävs i fopen samtalet, men du bör åtminstone passera en tom sträng. Detta beror på att fopen funktionen förväntar sig en sådan parameter, och även om du inte använder den i din stream_open implementering krävs fortfarande en dummy.
  • Enligt tester stream_write flera gånger. Kom ihåg att använda .= (Sammanlänkningstilldelning), inte = (direktvariabel tilldelning).

Exempel på användning

I <img> HTML-taggen kan en bild tillhandahållas direkt snarare än att använda en extern länk:

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

Beskär bild och ändra storlek

Om du har en bild och vill skapa en ny bild med nya dimensioner kan du använda imagecopyresampled funktion:

Skapa först en ny image med önskade dimensioner:

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

och lagra originalbilden i en variabel. För att göra det kan du använda en av createimagefrom* -funktionerna där * står för:

  • jpeg
  • gif
  • png
  • sträng

Till exempel:

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

Kopiera nu alla (eller delar av) originalbilden (src_img) till den nya bilden (dst_img) av imagecopyresampled :

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

För att ställa in src_* och dst_* dimensioner använder du bilden nedan:

ange bildbeskrivning här

Om du nu vill kopiera hela källbilden (initial) bilden till hela destinationsområdet (ingen beskärning):

$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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow