2017-06-24 2 views
1

Ich benutze img Uploader auf meinem ftp. Wenn Bild auf 1024x768 groß ist benutze ich Skript für die Größenänderung. Aber nach der Größe verlieren Qualität.Bildgröße ändern, ohne Qualität zu verlieren, wenn das Bild größer ist

-Code von uploader.php:

   if(@move_uploaded_file($_FILES['myfile']['tmp_name'], "$upload_folder/" . $newname)) 
       if($width>1024 || $height>768) { 
        require './image_resize.php'; 
        echo (image_resize("$upload_folder/" . $newname, "$upload_folder/" . $newname, 1024, 768)); 
       } 

-Code prom image_resize.php:

<?php ini_set('memory_limit','500M'); 
function image_resize($src, $dst, $width, $height, $crop=0){ 

    if(!($pic = @getimagesize($src))) 
     return false; 

    $w = $pic[0]; 
    $h = $pic[1]; 
    $type = substr($pic['mime'], 6); 

    $func = 'imagecreatefrom' . $type; 

    if(!function_exists($func)) 
     return false; 

    $img = $func($src); 

    if($crop){ 

      if($w < $width && $h < $height) 
       return false; 

      $ratio = max($width/$w, $height/$h); 
      $h = $height/$ratio; 
      $x = ($w - $width/$ratio)/2; 
      $w = $width/$ratio; 
    } 
    else{ 

      if($w < $width && $h < $height) 
       return false; 

      $ratio = min($width/$w, $height/$h); 
      $width = $w * $ratio; 
      $height = $h * $ratio; 
      $x = 0; 
    } 

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

    if($type == "gif" || $type == "png"){ 
     imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127)); 
     imagealphablending($new, false); 
     imagesavealpha($new, true); 
    } 
    imagecopyresampled($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); 

    $save = 'image' . $type; 

    $save($new, $dst); 
    return true; 
} 

Es ist unmöglich, die Größe zu reduzieren, ohne an Qualität einzubüßen :(

+0

Der dritte Parameter in 'image {type}()' ist Qualität ... http: //php.net/manual/en/function.imagejpeg.php – Rasclatt

Antwort

0

Da die Standard-API möglicherweise nicht wirklich effektiv, wenn es um die Bildverarbeitung geht, schlage ich vor, dass Sie eine Bibliothek verwenden .. Werfen Sie einen Blick auf grafika

0

Sie können auch einen externen Dienst für die Größenanpassung von Bildern verwenden, wie z. B. dieses Repo Flyimg.

1

Ich fand Skript für die Größenänderung, funktioniert gut. Ich denke, das ist ein, was ich :) brauche

http://sanchiz.net/blog/resizing-images-with-php

Aber ein Problem und bitte für mich korrigieren: Wenn die Größe benötigt PNG mit transparentem Hintergrund dieses Skript entfernen transparent und schwarzen Hintergrund hinzufügen.

In Kommentaren modifizierten Skript geschrieben, aber mit diesem Code nicht funktioniert Kompresse Funktion

Ich brauche diesen Code für Resize modifizieren PNG ohne transparenten Hintergrund entfernen:

class SimpleImage { 
public $image; 
public $image_type; 
public 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); 
    } 
} 
public function save($filename, $image_type = IMAGETYPE_JPEG, $compression = 100, $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); 
    } 
} 
public 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); 
    } 
} 
public function resizeToHeight($height) { 
    $ratio = $height/$this->getHeight(); 
    $width = $this->getWidth() * $ratio; 
    $this->resize($width, $height); 
} 
public function getHeight() { 
    return imagesy($this->image); 
} 
public function getWidth() { 
    return imagesx($this->image); 
} 
public function resize($width, $height) { 
    $new_image = imagecreatetruecolor($width, $height); 
    imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight()); 
    $this->image = $new_image; 
} 
public function resizeToWidth($width) { 
    $ratio = $width/$this->getWidth(); 
    $height = $this->getheight() * $ratio; 
    $this->resize($width, $height); 
} 
public function scale($scale) { 
    $width = $this->getWidth() * $scale/100; 
    $height = $this->getheight() * $scale/100; 
    $this->resize($width, $height); 
} 

Danke

Verwandte Themen