Portál o technologiích a vývoji

Obrázky ve webových aplikacích – Zpracování obrázku

Autor: Adam Klvač Datum: 17.9.2013 Počet shlédnutí: 3 921 249x

S obrázky lze dělat spoustu věcí a s všemožnými funkcemi si lze hezky hrát. Nejčastější formou zpracování bývá typicky zmenšení, proporcionální zmenšení, ořezávání, rotace, vkládání vodoznaků, nebo prostá komprese. To vše si nyní ukážeme.

Jak zahájit práci s obrázkem jsme si již ukázali v ukázce s rozpoznáním formátu. Proměnnou image si musíme držet a předávat dál, obsahuje totiž samotná data obrázku, která budeme potřebovat i při uložení.

Změna velikosti obrázku

Zmenšování a obecně změna velikosti obrázku bývá nejčastějším druhem operace, kterou ve spojistosti třeba s avatary provádíme. Dle požadavků na velikost se musíme správně rozhodnout, zda vůbec zmenšovat, nebo případně zvětšovat a musíme obrázek vhodně oříznout (nedělejte z uživatelů trpaslíky).

Funkcí getimagesize jsme již získali potřebné informace, první 2 indexy totiž obsahují šířku a výšku v pixelech. Častý je požadavek na určitou maximální velikost obrázku. Je tedy nutné zjistit, zda se obrázek do rozměru vleze a pokud přesahuje, musíme velikost přepočítat na novou.

// Maximální rozměry
$maxWidth = 800;
$maxHeight = 600;

// $info jsme již získali pomocí getimagesize()
$width = $info[0];
$height = $info[1];

// Pokud obrázek přesahuje alespoň jeden rozměr
if($width > $maxWidth || $height > $maxHeight) {

    $newWidth = $width;
    $newHeight = $height;

    if($width > $maxWidth) {
        $newHeight *= $maxWidth / $width;
        $newWidth = $maxWidth;
    }

    if($newHeight > $maxHeight) {
        $newWidth *= $maxHeight / $newHeight;
        $newHeight = $maxHeight;
    }

    // Zmenšíme obrázek
    $resized = imagecreatetruecolor($newWidth, $newHeight);
    imagecopyresampled(
        $resized, $image,
        0, 0, 0, 0,
        $newWidth, $newHeight,
        $width, $height
    );
    imagedestroy($image);
    $image = $resized;

}

// $image obsahuje zmenšený obrázek

Samotné zmenšení funguje tak, že vezmeme určitý výřez obrázku, zmenšíme jej a vložíme jej do nového obrázku. Je tedy nutné vytvořit nový, prázný obrázek o velikosti, na kterou budeme zmenšovat, následně funkcí imagecopyresam­pled provedeme přesun. První parametr obsahuje resource cílového obrázku, druhý resource obrázku, ze kterého budeme kopírovat. Další dva parametry obsahují souřadnice na cílovém obrázku, na které umístíme výřez, další dva samozřejmě souřadnice na zmenšovaném obrázku. Poslední 4 parametry obsahují šířku a výšku výřezu na cílovém a zmenšovaném obrázku.

Funkcí imagedestroy uvolníme obrázek z paměti. PHP skripty mají většinou dost krátký život, ale je dobré na to nezapomínat a pokud provádíme několik úprav, je dobré tuto funkci použít.

Oříznutí obrázku

Proporcionální zmenšení na určité maximální rozměry se hodí, ale někdy to nestačí. Uživatelské avatary mohou být původně běžné fotografie ve formátu 4:3 či 16:9, avšak u komentářů počítáme s tím, že obrázek bude mít čtvercový rozměr. Je tedy nutné obrázek oříznout.

// Obrázek přesahuje v jednom z rozměrů, nebo není čtvercový
if($width > $maxSize || $height > $maxSize || $width !== $height) {

    // Nastavíme si souřadnice výřezu na 0:0
    $x = $y = 0;

    if($width > $height) {
        $x = ($width - $height) / 2;
        $width = $height;
    } else {
        $y = ($height - $width) / 2;
        $height = $width;
    }

    $resized = imagecreatetruecolor($maxSize, $maxSize);
    imagecopyresampled(
        $resized, $image,
        0, 0, $x, $y,
        $maxSize, $maxSize,
        $width, $height
    );
    imagedestroy($image);
    $image = $resized;

}

V tomto příkladu jednoduše zjistíme, který rozměr je menší. Ten pak použijeme jako rozměr čtverce, který ze zmenšovaného obrázku „vyřízneme“. Vypočítáme také souřadnice čtverce ve zmenšovaném obrázku tak, aby se vyřezávalo z prostředka. Ideální by bylo samozřejmě, kdyby oblast k vyřezání vybral uživatel a i to si později ukážeme.

Rotace obrázku

Rotace není až tak běžně používaná a ke zobrazení otočeného obrázku bych raději použil stylování, hodit se to ale může. Rotaci provedeme funkcí imagerotate, která přijímá postupně povinné parametry: resource obrázku, úhel ve stupních a barvu pozadí. Barva pozadí se využije pro plochy, které nebude pokrývat otočený obrázek. Obrázek se automaticky zvětší tak, aby se do něj otáčená oblast vešla. Při otáčení o pravé úhly nebude barva pozadí vidět, ale jinak ano. Můžeme ji zadat známým způsobem, který vám může být povědomý z CSS – hexadecimálním zápisem.

$rotated = imagerotate($image, 45, 0xFF0000);

Do proměnné $rotated jsme získali resource otočeného obrázku. Otáčeli jsme o 45° a jako barvu pro nevyplněné oblasti jsme použili červenou – notace RGB. Barva je vždy předávána funkcím jako celé číslo, které můžeme získat také následovně:

$color = imagecolorallocate($image, 255, 0, 255);

Funkce přijímá obrázek a postupně barvy RGB (v tomto případě jde o růžovou). Je nutné dodat obrázek, protože PHP potřebuje znát paletu barev.

Štítky: | | | | | |

Žádné komentáře

Poslat komentář

Vaše e-mailová adresa nebude zveřejněna.