Képek méretezése, vágása, arányosítása PHP-ben

img

Sokunknak okozhatnak problémát a túl nagy képek, a nem megfelelő méretarány vagy egy kép előnézeti képének létrehozása. Nekem is fejtörést okozott régebben, hogy hogyan vágjak egy 100×100-as képet, vagy hogyan csináljak egyszerű előnézeti képeket. Ekkor akadtam rá erre a scriptre. Azóta a programjaim nagy részében benn van. Igaz sokat fejlődött.

A fent említett problémára találtam a következő scriptet, mely megoldja a gondjainkat. A program képes képeket méretezni, vágni és arányosítani is. Méretezhetünk vele szélességre, magasságra, fix méretre. Vághatunk vele előre meghatározott dimenzióban, és százalékos értékben arányosíthatjuk is a képünket. A kapott eredményt menthetjük vagy megjeleníthetjük. Tehát mindent tud, amit egy kép kezeléséhez tudnia kell.

A kód:

class SimpleImage {
var $image;
var $image_type;
function load($filename) {
    $image_info = getimagesize($filename);
    $this->image_type = $image_info[2];
    if( $this->image_type == IMAGETYPE_JPEG ) {
        $this->image = imagecreatefromjpeg($filename);
    } elseif( $this->image_type == IMAGETYPE_GIF ) {
        $this->image = imagecreatefromgif($filename);
    } elseif( $this->image_type == IMAGETYPE_PNG ) {
        $this->image = imagecreatefrompng($filename);
    }
}

function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
    if( $image_type == IMAGETYPE_JPEG ) {
        imagejpeg($this->image,$filename,$compression);
    } elseif( $image_type == IMAGETYPE_GIF ) {
        imagegif($this->image,$filename);
    } elseif( $image_type == IMAGETYPE_PNG ) {
        imagepng($this->image,$filename);
    }
    if( $permissions != null) {
        chmod($filename,$permissions);
    }
}

function output($image_type=IMAGETYPE_JPEG) {
    if( $image_type == IMAGETYPE_JPEG ) {
        imagejpeg($this->image);
    } elseif( $image_type == IMAGETYPE_GIF ) {
        imagegif($this->image);
    } elseif( $image_type == IMAGETYPE_PNG ) {
        imagepng($this->image);
    }
}

function getWidth() {
    return imagesx($this->image);
}

function getHeight() {
    return imagesy($this->image);
}

function resizeToHeight($height) {
    $ratio = $height / $this->getHeight();
    $width = $this->getWidth() * $ratio;
    $this->resize($width,$height);
}

function resizeToWidth($width) {
    $ratio = $width / $this->getWidth();
    $height = $this->getheight() * $ratio;
    $this->resize($width,$height);
}

function scale($scale) {
    $width = $this->getWidth() * $scale/100;
    $height = $this->getheight() * $scale/100;
    $this->resize($width,$height);
}

function cut($w,$h){
    $new_image = imagecreatetruecolor($w, $h);
    $x=($this->getWidth()-$w)/2;
    $y=($this->getHeight()-$h)/2;
    imagecopyresampled($new_image, $this->image, 0, 0, $x, $y, $w, $h, $w, $h);
    $this->image = $new_image;
}

function resizeCut($width,$height){
    $rate1=$this->getWidth()/$this->getheight();
    $rate2=$width/$height;
    if($rate1==$rate2){
        $this->resize($width,$height);
    } else {
        if($rate1 > $rate2){
            $this->resizeToHeight($height);
            $this->cut($width,$height);
        } else {
            $this->resizeToWidth($width);
            $this->cut($width,$height);
        }
    }
}

function resize($width,$height) {
    $new_image = imagecreatetruecolor($width, $height);
    if( $this->image_type == IMAGETYPE_GIF || $this->image_type == IMAGETYPE_PNG ) {
        $current_transparent = imagecolortransparent($this->image);
        if($current_transparent != -1) {
            $transparent_color = imagecolorsforindex($this->image, $current_transparent);
            $current_transparent = imagecolorallocate($new_image, $transparent_color[''red''], $transparent_color[''green''], $transparent_color[''blue'']);
            imagefill($new_image, 0, 0, $current_transparent);
            imagecolortransparent($new_image, $current_transparent);
        } elseif($this->image_type == IMAGETYPE_PNG) {
            imagealphablending($new_image, false);
            $color = imagecolorallocatealpha($new_image, 0, 0, 0, 127);
            imagefill($new_image, 0, 0, $color);
            imagesavealpha($new_image, true);
        }
    }
    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
    $this->image = $new_image;
}
}

Egy pár példát is teszek fel, hogy lássátok mit is csinál a script:

Töltsünk le valamilyen képet :)

Minta kép 1

Egy 2000×1339 pixeles kép.

Akkor ezt most alakítsuk át egy fix méretű jpg -re (400x250px):

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.png');
$image->resize(400,250);
$image->save('teszt1.jpg');

Végeredmény:

Minta kép 2

hogy kicsit látványosabb legyen találjunk valami húzósabb méretet (300x60px):

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.png');
$image->resize(300,60);
$image->save('teszt1-1.jpg');

Végeredmény:

Minta kép 3

Méretezzük fix magasságúra (150px):

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.png');
$image->resizeToHeight(150);
$image->save('teszt3.jpg');

Végeredmény:

Minta kép 4

Méretezzük arányosan az eredetihez képest(45%):

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.png');
$image->scale(45);
$image->save('teszt4.jpg');

Végeredmény:

Minta kép 5

Vágjuk fix méretűre (200x200px):

include('SimpleImage.php');
$image = new SimpleImage();
$image->load('picture.png');
$image->resizeCut(200,200);
$image->save('teszt5.jpg');

Végeredmény:

Minta kép 6

Szerintem nagyon jól alkalmazható bármilyen szituációban. Az eredeti script GNU alatt lett kiadva, ez lett a resizeCut fügvénnyel kiegészítve.

A scriptnek gondjai voltak az átlátszó png és gif képekkel, így a készítők kiegészítették, most már tud átlátszóságot is kezelni.

Mióta régebben megírtam ezt a cikket, már rengeteget módosítottam a programon, így már a saját verzióm képes resizeFill-re :) azaz kitölti a hátteret a megadott színnel és egyéb apróbb módosítások is bekerültek, ha lesz időm, akkor készítek egy letölthető verziót belőle, és kibővítem a leírást is, hogy mindenki használni tudja :)

Forrás: WhiteHat Webdesign