Маштаб малюнка з дапамогай PHP і захаванне суадносін бакоў

У асноўным я хачу, каб загрузіць малюнак (які я адсартаваны) і маштабаваць яго да пэўных абмежаванняў, такіх як максімальная шырыня і вышыня, але захаваць прапорцыі зыходнага малюнка.

У мяне няма Imagick усталяваны на сэрвэры - у адваротным выпадку гэта будзе лёгка.

Любая дапамога цэніцца як заўсёды. Дзякуючы.

EDIT: Я не патрэбен увесь код або што-небудзь, толькі штуршок у правільным кірунку было б фантастычным.

13

8 адказы

Фактычна прынятае рашэнне з'яўляецца <�моцны> не правільнае рашэнне. Прычына простая: будзе мець месца выпадкі, калі стаўленне зыходнага малюнка і стаўленне мэтавага малююнкі будуць адрознівацца. Любы разлік павінен адлюстроўваць гэтую розніцу.

Калі ласка, звярніце ўвагу на адпаведныя радкі з прыкладу, прыведзенага на сайце PHP.net:

$ratio_orig = $width_orig/$height_orig;

if ($width/$height > $ratio_orig) {
   $width = $height*$ratio_orig;
} else {
   $height = $width/$ratio_orig;
}

The full example may be found here: http://php.net/manual/en/function.imagecopyresampled.php

Ёсць іншыя адказы (з прыкладамі) на StackOverflow на падобныя пытанні (той жа пытанне сфармулявана ў іншай форме), якія пакутуюць ад тых жа праблем.

прыклад:

Скажам, у нас ёсць выява 1630 х 2400 пікселяў, што мы хочам быць аўто з змененым памерам з захаваннем прапорцый да 160 х 240. Давайце рабіць некаторую матэматыку, якое прымае рашэнне:

if($old_x < $old_y) 
    {
        $thumb_w    =   $old_x*($new_width/$old_y);
        $thumb_h    =   $new_height;
    }

вышыня = 240 шырыня = 1630 * (160/2400) = 1630 * 0,0666666666666667 = 108,6666666666667 108,6 х 240 гэта не правільнае рашэнне.

Наступнае рашэнне, прапанаванае заключаецца ў наступным:

if($old_x < $old_y)
    {
        $thumb_w    =   $old_x/$old_y*$newHeight;
        $thumb_h    =   $newHeight;
    }

вышыня = 240; шырыня = 1630/2400 * 240 = 163 Гэта лепш (як гэта захаваць прапорцыі), але ён перавысіў максімальна дапушчальную шырыню.

І церпяць няўдачу.

Мы робім матэматыку ў адпаведнасці з рашэннем, прапанаваным PHP.net: шырыня = 160 вышыня = 160/(1630/2400) = 160/+0,6791666666666667 = +235,5828220858896 (далей <�ет> яшчэ пункт). 160 х 236 (акруглена) правільны адказ.

15
дададзена

Я напісаў peice кода, як гэта для іншага праекта, я зрабіў. Я скапіяваў яго ніжэй, магчыма, спатрэбіцца трохі майстраваць! (Гэта не патрабуецца бібліятэка GD)

Гэтыя параметры ён неабходны:

$image_name - Name of the image which is uploaded
$new_width - Width of the resized photo (maximum)
$new_height - Height of the resized photo (maximum)
$uploadDir - Directory of the original image
$moveToDir - Directory to save the resized image

Ён будзе маштабавацца ўніз або ўверх малюнак да максімальнай шырыні або вышыні

function createThumbnail($image_name,$new_width,$new_height,$uploadDir,$moveToDir)
{
    $path = $uploadDir . '/' . $image_name;

    $mime = getimagesize($path);

    if($mime['mime']=='image/png') { 
        $src_img = imagecreatefrompng($path);
    }
    if($mime['mime']=='image/jpg' || $mime['mime']=='image/jpeg' || $mime['mime']=='image/pjpeg') {
        $src_img = imagecreatefromjpeg($path);
    }   

    $old_x          =   imageSX($src_img);
    $old_y          =   imageSY($src_img);

    if($old_x > $old_y) 
    {
        $thumb_w    =   $new_width;
        $thumb_h    =   $old_y*($new_height/$old_x);
    }

    if($old_x < $old_y) 
    {
        $thumb_w    =   $old_x*($new_width/$old_y);
        $thumb_h    =   $new_height;
    }

    if($old_x == $old_y) 
    {
        $thumb_w    =   $new_width;
        $thumb_h    =   $new_height;
    }

    $dst_img        =   ImageCreateTrueColor($thumb_w,$thumb_h);

    imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y); 


   //New save location
    $new_thumb_loc = $moveToDir . $image_name;

    if($mime['mime']=='image/png') {
        $result = imagepng($dst_img,$new_thumb_loc,8);
    }
    if($mime['mime']=='image/jpg' || $mime['mime']=='image/jpeg' || $mime['mime']=='image/pjpeg') {
        $result = imagejpeg($dst_img,$new_thumb_loc,80);
    }

    imagedestroy($dst_img); 
    imagedestroy($src_img);

    return $result;
}
9
дададзена
? Калі вы карыстаецеся і зрабіць пошук для GD, калі яна ўключаная, то дадзеная функцыя павінна працаваць, нават без Imagick :), аднак, калі вы атрымліваеце якую-небудзь памылку, не саромейцеся, дайце мне ведаць.
дададзена аўтар Phil Cross, крыніца
Не ведаю, чаму гэта становіцца павышаючага галасоў, я напісаў гэта шмат гадоў таму, нядаўна наткнуўся на яго, спрабуючы вырашыць тую ж праблему (зноў жа) і не захоўваць прапорцыі!
дададзена аўтар Phil Cross, крыніца
Вы, вядома, маю на ўвазе $ thumb_h = $ old_y * ($ new_width/$ old_x); і $ thumb_w = $ old_x * ($ new_height/$ old_y); , калі зыходны малюнак ня квадрат, гэта заўсёды будзе змяняць памер самай вялікай магчымай мініяцюру, які мае $ new_height , як максімальная вышыня і $ новай шырынёй як максімальная шырыня
дададзена аўтар Ki Jéy, крыніца
Не працуе для мяне. Ня захаваць прапорцыі.
дададзена аўтар Pedro Araujo Jorge, крыніца
Ніца - Вялікі дзякуй, што будзе карысна. Я размаўляў з гаспадаром, каб паспрабаваць атрымаць Imagick Сартаваць ... атрымаць фатальную памылку ў цяперашні час, дзе ён кажа, што яго не знайшоў клас ...
дададзена аўтар Steve_M, крыніца
Не працуе для мяне. Здаецца, не з'яўляецца добрым рашэннем.
дададзена аўтар Javier Núñez, крыніца

Формула няправільна для захавання прапорцый. Яна павінна быць: першапачатковая вышыня/шырыня х арыгінальнай новай шырынёй = новая вышыня

function createThumbnail($imageName,$newWidth,$newHeight,$uploadDir,$moveToDir)
{
    $path = $uploadDir . '/' . $imageName;

    $mime = getimagesize($path);

    if($mime['mime']=='image/png'){ $src_img = imagecreatefrompng($path); }
    if($mime['mime']=='image/jpg'){ $src_img = imagecreatefromjpeg($path); }
    if($mime['mime']=='image/jpeg'){ $src_img = imagecreatefromjpeg($path); }
    if($mime['mime']=='image/pjpeg'){ $src_img = imagecreatefromjpeg($path); }

    $old_x = imageSX($src_img);
    $old_y = imageSY($src_img);

    if($old_x > $old_y)
    {
        $thumb_w    =   $newWidth;
        $thumb_h    =   $old_y/$old_x*$newWidth;
    }

    if($old_x < $old_y)
    {
        $thumb_w    =   $old_x/$old_y*$newHeight;
        $thumb_h    =   $newHeight;
    }

    if($old_x == $old_y)
    {
        $thumb_w    =   $newWidth;
        $thumb_h    =   $newHeight;
    }

    $dst_img        =   ImageCreateTrueColor($thumb_w,$thumb_h);

    imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);


   //New save location
    $new_thumb_loc = $moveToDir . $imageName;

    if($mime['mime']=='image/png'){ $result = imagepng($dst_img,$new_thumb_loc,8); }
    if($mime['mime']=='image/jpg'){ $result = imagejpeg($dst_img,$new_thumb_loc,80); }
    if($mime['mime']=='image/jpeg'){ $result = imagejpeg($dst_img,$new_thumb_loc,80); }
    if($mime['mime']=='image/pjpeg'){ $result = imagejpeg($dst_img,$new_thumb_loc,80); }

    imagedestroy($dst_img);
    imagedestroy($src_img);
    return $result;
}
3
дададзена
Проста, ці не захоўваць прапорцыі. Калі я хачу, каб змяніць памер 300x300 малюнка на 500x200, гэта створыць 500x200.
дададзена аўтар vaso123, крыніца

Here is a comprehensive application that I worked hard on it to include most common operations like scale up & scale down, thumbnail, preserve aspect ratio, convert file type, change quality/file size and more...

<?php
//##// Resize (and convert) image (Scale up & scale down, thumbnail, preserve aspect ratio) //##//
///////////////////////////////////////////////
///////////////// Begin.Setup /////////////////
// Source File:
$src_file = "/your/server/path/to/file.png";// png or jpg files only

// Resize Dimensions:
// leave blank for no size change (convert only)
// if you specify one dimension, the other dimension will be calculated according to the aspect ratio
// if you specify both dimensions system will take care of it depending on the actual image size 
// $newWidth = 2000;
// $newHeight = 1500;

// Destination Path: (optional, if none: download image)
$dst_path = "/your/server/path/new/";

// Destination File Name: (Leave blank for same file name)
// $dst_name = 'image_name_only_no_extension';

// Destination File Type: (Leave blank for same file extension)
// $dst_type = 'png';
$dst_type = 'jpg';

// Reduce to 8bit - 256 colors (Very low quality but very small file & transparent PNG. Only for thumbnails!)
// $palette_8bit = true;

///////////////// End.Setup /////////////////
///////////////////////////////////////////////
if (!$dst_name){$dst_name = strtolower(pathinfo($src_file, PATHINFO_FILENAME));}
if (!$dst_type){$dst_type = strtolower(pathinfo($src_file, PATHINFO_EXTENSION));}
if ($palette_8bit){$dst_type = 'png';}
if ($dst_path){$dst_file = $dst_path . $dst_name . '.' . $dst_type;}

$mime = getimagesize($src_file);// Get image dimensions and type

// Destination File Parameters:
if ($dst_type == 'png'){
    $dst_content = 'image/png';
    $quality = 9;// All same quality! 0 too big file//0(no comp.)-9 (php default: 6)
} elseif ($dst_type == 'jpg'){
    $dst_content = 'image/jpg';
    $quality = 85;// 30 Min. 60 Mid. 85 Cool. 90 Max. (100 Full)//0-100 (php default: 75)
} else {
    exit('Unknown Destination File Type');
}

// Source File Parameters:
if ($mime['mime']=='image/png'){$src_img = imagecreatefrompng($src_file);}
elseif ($mime['mime']=='image/jpg'){$src_img = imagecreatefromjpeg($src_file);}
elseif ($mime['mime']=='image/jpeg'){$src_img = imagecreatefromjpeg($src_file);}
elseif ($mime['mime']=='image/pjpeg'){$src_img = imagecreatefromjpeg($src_file);}
else {exit('Unknown Source File Type');}

// Define Dimensions:
$old_x = imageSX($src_img);
$old_y = imageSY($src_img);

if ($newWidth AND $newHeight){
    if($old_x > $old_y){
        $new_x    =   $newWidth;
        $new_y    =   $old_y/$old_x * $newWidth;
    } elseif($old_x < $old_y){
        $new_y    =   $newHeight;
        $new_x    =   $old_x/$old_y * $newHeight;
    } elseif($old_x == $old_y){
        $new_x    =   $newWidth;
        $new_y    =   $newHeight;
    }
} elseif ($newWidth){
    $new_x    =   $newWidth;
    $new_y    =   $old_y/$old_x * $newWidth;
} elseif ($newHeight){
    $new_y    =   $newHeight;
    $new_x    =   $old_x/$old_y * $newHeight;
} else {
    $new_x    =   $old_x;
    $new_y    =   $old_y;
}

$dst_img = ImageCreateTrueColor($new_x, $new_y);

if ($palette_8bit){//////// Reduce to 8bit - 256 colors ////////
    $transparent = imagecolorallocatealpha($dst_img, 255, 255, 255, 127); 
    imagecolortransparent($dst_img, $transparent);
    imagefill($dst_img, 0, 0, $transparent);
    imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_x,$new_y,$old_x,$old_y);// Great quality resize.
    imagetruecolortopalette($dst_img, false, 255);
    imagesavealpha($dst_img, true);
} else {
   //Check image and set transparent for png or white background for jpg
    if ($dst_type == 'png'){
        imagealphablending($dst_img, false);
        imagesavealpha($dst_img, true);
        $transparent = imagecolorallocatealpha($dst_img, 255, 255, 255, 127);
        imagefilledrectangle($dst_img, 0, 0, $new_x, $new_y, $transparent);
    } elseif ($dst_type == 'jpg'){
        $white = imagecolorallocate($dst_img, 255, 255, 255);
        imagefilledrectangle($dst_img, 0, 0, $new_x, $new_y, $white);
    }

    imagecopyresampled($dst_img,$src_img,0,0,0,0,$new_x,$new_y,$old_x,$old_y);// Great quality resize.
}

// Skip the save to parameter using NULL, then set the quality; imagejpeg($dst_img);=> Default quality
if ($dst_file){
    if ($dst_type == 'png'){
        imagepng($dst_img, $dst_file, $quality);
    } elseif ($dst_type == 'jpg'){
        imagejpeg($dst_img, $dst_file, $quality);
    }
} else {
    header('Content-Disposition: Attachment;filename=' . $dst_name . '.' . $dst_type);// comment this line to show image in browser instead of download
    header('Content-type: ' . $dst_content);
    if ($dst_type == 'png'){
        imagepng($dst_img, NULL, $quality);
    } elseif ($dst_type == 'jpg'){
        imagejpeg($dst_img, NULL, $quality);
    }
}
imagedestroy($src_img);
imagedestroy($dst_img);
//##// END : Resize image (Scale Up & Down) (thumbnail, bigger image, preserve aspect ratio) END //##//
1
дададзена
Гэта вельмі прасунуты сцэнар, я шмат працаваў на пакрыццё больш за ўсё і ўдасканальваць яго. Я заўважыў downvote, вы на самой справе спрабаваў? Дайце мне ведаць, калі што-то не так пра гэта ....
дададзена аўтар Tarik, крыніца

Я думаў пра тое, як дамагчыся гэтага, і я прыйшоў з вельмі добрым рашэннем, якое працуе ў любым выпадку ... Дапусцім, вы хочаце, каб змяніць памер малюнка, цяжкія карыстальнікі загружаюць на ваш сайт, але вам гэта трэба, каб падтрымліваць суадносіны. Так што я прыйшоў з гэтым:

<?php
// File 
$filename = 'test.jpg';



// Get sizes
list($width, $height) = getimagesize($filename);
//obtain ratio
$imageratio = $width/$height;

if($imageratio >= 1){
    $newwidth = 600;
    $newheight = 600/$imageratio; 
}
else{
     $newidth = 400;
     $newheight = 400/$imageratio;
};




// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, 
$height);

// Output
imagejpeg($thumb, "img/test.jpg");
imagedestroy();
?>

У гэтым выпадку, калі шырыня больш вышыні, я хацеў, каб шырыня 600px і калі вышыня была больш, чым шырыня, я хацеў, каб шырыня 400px

1
дададзена

I know you are looking for a divisor that will allow resize your image proportionally. Check this demo

<�Моцны> Як атрымаць наш дзельнік матэматычна

дазваляе выказаць здагадку, наша зыходны малюнак мае шырыню х і вышыні ў; х = 300 і у = 700

Максімальная вышыня і максімальная шырыня 200;

Па-першае, мы праверым, які памер малюнка больш, чым іншыя. Наша вышыня (у) больш, чым шырыня (х)

Па-другое, мы правяраем, калі наша вышыня больш, чым наша максімальная вышыня. Для нашага выпадку, наша вышыня больш, чым максімальная вышыня. У выпадку, калі яна менш максімальнай вышыні, мы ўсталёўваем нашу новую вышыню нашай першапачатковай вышыні.

Нарэшце, мы шукаем наш дзельнік, як паказана ніжэй

if y is set to maximum height 200 and max-y=200;
y=max-y, that is 
if y=max-y
what about 
x=?
that is, 
if 700 is resized to 200
what about 300?
700=200
300=?
new width = (200 (new height) * 300(width))/700 (height)
so our divisor is
divisor= new height (300)/height(700) 
new width = divisor * width or width/(1/divisor)

і наадварот, па шырыні, калі яна больш, чым вышыня

if ($width > $height) {
    if($width < $max_width)
        $newwidth = $width;

    else

    $newwidth = $max_width; 


    $divisor = $width/$newwidth;
    $newheight = floor( $height/$divisor);
}
else {

     if($height < $max_height)
         $newheight = $height;
     else
         $newheight =  $max_height;

    $divisor = $height/$newheight;
    $newwidth = floor( $width/$divisor );
}

Глядзіце поўны прыклад і паспрабаваць яго з дапамогай <�моцны> працуе дэманстрацыйная .

0
дададзена

Я знайшоў матэматычны спосаб зрабіць, каб атрымаць гэтую працу

Github repo - https://github.com/gayanSandamal/easy-php-image-resizer

Live example - https://plugins.nayague.com/easy-php-image-resizer/

<?php
//path for the image
$source_url = '2018-04-01-1522613288.PNG';

//separate the file name and the extention
$source_url_parts = pathinfo($source_url);
$filename = $source_url_parts['filename'];
$extension = $source_url_parts['extension'];

//define the quality from 1 to 100
$quality = 10;

//detect the width and the height of original image
list($width, $height) = getimagesize($source_url);
$width;
$height;

//define any width that you want as the output. mine is 200px.
$after_width = 200;

//resize only when the original image is larger than expected with.
//this helps you to avoid from unwanted resizing.
if ($width > $after_width) {

    //get the reduced width
    $reduced_width = ($width - $after_width);
    //now convert the reduced width to a percentage and round it to 2 decimal places
    $reduced_radio = round(($reduced_width/$width) * 100, 2);

    //ALL GOOD! let's reduce the same percentage from the height and round it to 2 decimal places
    $reduced_height = round(($height/100) * $reduced_radio, 2);
    //reduce the calculated height from the original height
    $after_height = $height - $reduced_height;

    //Now detect the file extension
    //if the file extension is 'jpg', 'jpeg', 'JPG' or 'JPEG'
    if ($extension == 'jpg' || $extension == 'jpeg' || $extension == 'JPG' || $extension == 'JPEG') {
        //then return the image as a jpeg image for the next step
        $img = imagecreatefromjpeg($source_url);
    } elseif ($extension == 'png' || $extension == 'PNG') {
        //then return the image as a png image for the next step
        $img = imagecreatefrompng($source_url);
    } else {
        //show an error message if the file extension is not available
        echo 'image extension is not supporting';
    }

    //HERE YOU GO :)
    //Let's do the resize thing
    //imagescale([returned image], [width of the resized image], [height of the resized image], [quality of the resized image]);
    $imgResized = imagescale($img, $after_width, $after_height, $quality);

    //now save the resized image with a suffix called "-resized" and with its extension. 
    imagejpeg($imgResized, $filename . '-resized.'.$extension);

    //Finally frees any memory associated with image
    //**NOTE THAT THIS WONT DELETE THE IMAGE
    imagedestroy($img);
    imagedestroy($imgResized);
}
?>
0
дададзена
<?php
Class ResizedImage
{
    public $imgfile;
    public $string      = '';
    public $new_width   = 0;
    public $new_height  = 0;
    public $angle       = 0;
    public $max_font_size = 1000;
    public $cropped = false;//whether crop the original image if h or w > new h or w
    public $font = 'fonts/arialbd.ttf';

    private $img;
    private $trans_colour;
    private $orange;
    private $white; 
    private $whitetr;
    private $blacktr;

    public function PrintAsBase64()
    {
        $this->SetImage();
        ob_start();
        imagepng($this->img);
        $b64img = ob_get_contents();
        ob_clean();
        imagedestroy($this->img);
        $b64img = base64_encode($b64img);
        echo($b64img);
    }
    public function PrintAsImage()
    {
        $this->SetImage();

        header('Content-type: image/png');

        imagepng($this->img);
        imagedestroy($this->img);
    }

    private function SetImage()
    {
        if ($this->imgfile == '') {$this->imgfile='NoImageAvailable.jpg';}
        $this->img          = imagecreatefromstring(file_get_contents($this->imgfile));
        $this->trans_colour = imagecolorallocatealpha($this->img, 0, 0, 0, 127);
        $this->orange       = imagecolorallocate($this->img, 220, 210, 60);
        $this->white        = imagecolorallocate($this->img, 255,255, 255);
        $this->whitetr      = imagecolorallocatealpha($this->img, 255,255, 255, 95);
        $this->blacktr      = imagecolorallocatealpha($this->img, 0, 0, 0, 95);

        if ((!$this->cropped) && ($this->string !=''))
        {$this->watermarkimage();}

        if (($this->new_height > 0) && ($this->new_width > 0)) {$this->ResizeImage();};

        if (($this->cropped) && ($this->string !=''))
        {$this->watermarkimage();}

        imageAlphaBlending($this->img, true);
        imageSaveAlpha($this->img, true);
    }
    ////
    private function ResizeImage()
    {
        # v_fact and h_fact are the factor by which the original vertical/horizontal
        # image sizes should be multiplied to get the image to your target size.
        $v_fact = $this->new_height/imagesy($this->img);//target_height/im_height; 
        $h_fact = $this->new_width/imagesx($this->img);//target_width/im_width;
        # you want to resize the image by the same factor in both vertical 
        # and horizontal direction, so you need to pick the correct factor from
        # v_fact/h_fact so that the largest (relative to target) of the new height/width
        # equals the target height/width and the smallest is lower than the target.
        # this is the lowest of the two factors
        if($this->cropped) 
        {   $im_fact = max($v_fact, $h_fact);   }
        else
        {   $im_fact = min($v_fact, $h_fact);   }

        $new_height = round(imagesy($this->img) * $im_fact);
        $new_width  = round(imagesx($this->img) * $im_fact);

        $img2 = $this->img;     
        $this->img = imagecreatetruecolor($new_width, $new_height);     
        imagecopyresampled($this->img, $img2, 0, 0, 0, 0, $new_width, $new_height, imagesx($img2), imagesy($img2));

        $img2 = $this->img;     
        $this->img = imagecreatetruecolor($this->new_width, $this->new_height);
        imagefill($this->img, 0, 0, $this->trans_colour);

        $dstx = 0;
        $dsty = 0;
        if ($this->cropped)
        {
            if (imagesx($this->img) < imagesx($img2))
            {   $dstx = round((imagesx($this->img)-imagesx($img2))/2); }

            if (imagesy($this->img) < imagesy($img2))
            {   $dsty = round((imagesy($this->img)-imagesy($img2))/2); }
        }
        else
        {
            if (imagesx($this->img) > imagesx($img2))
            {   $dstx = round((imagesx($this->img)-imagesx($img2))/2); }

            if (imagesy($this->img) > imagesy($img2))
            {   $dsty = round((imagesy($this->img)-imagesy($img2))/2); }
        }

        imagecopy ( $this->img, $img2, $dstx, $dsty, 0, 0, imagesx($img2) , imagesy($img2));
        imagedestroy($img2);        
    }   

    ////

    private function calculateTextBox($text,$fontFile,$fontSize,$fontAngle) 
    { 
        /************ 
        simple function that calculates the *exact* bounding box (single pixel precision). 
        The function returns an associative array with these keys: 
        left, top:  coordinates you will pass to imagettftext 
        width, height: dimension of the image you have to create 
        *************/ 
        $rect = imagettfbbox($fontSize,$fontAngle,$fontFile,$text); 
        $minX = min(array($rect[0],$rect[2],$rect[4],$rect[6])); 
        $maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6])); 
        $minY = min(array($rect[1],$rect[3],$rect[5],$rect[7])); 
        $maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7])); 

        return array( 
        "left"   => abs($minX) - 1, 
        "top"    => abs($minY) - 1, 
        "width"  => $maxX - $minX, 
        "height" => $maxY - $minY,
        "box"    => $rect ); 
    }

    private function watermarkimage($font_size=0)
    {
        if ($this->string == '')
        {die('Watermark function call width empty string!');}

        $box = $this->calculateTextBox($this->string, $this->font, $font_size, $this->angle);
        while ( ($box['width'] < imagesx($this->img)) && ($box['height'] < imagesy($this->img)) && ($font_size <= $this->max_font_size) )
        {
            $font_size++;
            $box = $this->calculateTextBox($this->string, $this->font, $font_size, $this->angle);   
        }

        $font_size--;
        $box = $this->calculateTextBox($this->string, $this->font, $font_size, $this->angle);

        $vcenter = round((imagesy($this->img)/2) + ($box['height']/2));  
        $hcenter = round((imagesx($this->img) - $box['width'])/2 );

        imagettftext($this->img, $font_size, $this->angle, $hcenter, $vcenter, $this->blacktr, $this->font, $this->string);     
        imagettftext($this->img, $font_size, $this->angle, $hcenter+1, $vcenter-2, $this->whitetr, $this->font, $this->string);
    }
}
?>

Акрамя таго, я выкарыстаў прыняты адказ, але гэта не перашкаджае суадносіны ў некаторых выпадках. Я знайшоў некалькі добрых адказы на форуме і паклаў іх разам і, нарэшце, стварыў клас, які змяняе памер малюнка. У дадатковай функцыі і можа змясціць тэкст вадзянога знака.

і можна ўбачыць, што адбываецца, калі выбіраюць, каб абрэзаць ці не, калі не празрыстая вобласць будзе дададзеная ў новым змененым малюнку.

Гэты прыклад больш, чым прасілі, але я думаю, што гэта добры прыклад.

0
дададзена
гэта, здаецца, добрая функцыю і працуе, як задумана, але што, калі я хачу, каб абрэзаць заўсёды .. напрыклад маё прызначэнне малюнак 500 400 затым://W400 H300 = stretchW | stretchH//W400 H500 = stretchW + Н пры першым кадраванне H//W500 Н300 = расцягу W + H спачатку кадраванне Вт//W500 H500 = cropW | cropH
дададзена аўтар Rudolf Rein, крыніца
Я не ясна зразумець вашу пункт гледжання, але, функцыя працуе. і можна выбраць, каб абрэзаць ці не. Ўсталёўвае значэнне па змаўчанні для «сапраўднага», калі і з дапамогай функцыі на вашай старонцы. Калі і можа прымусіць яго працаваць лепш з некаторымі зменамі ў гасцінна. BTW Я не PHP/вэб-майстар, проста аматар.
дададзена аўтар coban, крыніца