Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z tworzeniem obrazkow
Forum PHP.pl > Forum > PHP
johnnyjp
hej. oto kod:

  1. <?
  2.  
  3. function imagecopyresampledselection($filename, $desired_width, $desired_height, $bordersize, $position, $background, $border_color, $constrain_proportions)
  4. {      
  5.    // pobierz wymiary
  6.    list($width, $height) = getimagesize($filename);
  7.    
  8.    // jesli nie podano wymiarow docelowych, zmniejszamy obrazek 2 razy w stosunku do oryginalu
  9.    if(!isset($desired_width) || !isset($desired_height)){
  10.        $desired_width = $width / 2;
  11.        $desired_height = $height / 2;
  12.    }
  13.    
  14.    if($desired_width/$desired_height > $width/$height){
  15.        $new_width = $desired_width;
  16.        $new_height = $height * ($desired_width / $width);
  17.    }
  18.    else{
  19.        $new_width = $width * ($desired_height / $height);
  20.        $new_height = $desired_height;
  21.    }
  22.    
  23.    // zmniejszanie zachowujac proprcje
  24.    if(isset($constrain_proportions)){
  25.        $old_ratio = $width/$desired_width;
  26.        $new_ratio = $height/$desired_height;
  27.        
  28.        if($old_ratio > $new_ratio) {
  29.            $new_width = $desired_width;
  30.            $new_height = $height/$old_ratio;
  31.        }
  32.        else {
  33.            $new_height = $desired_height;
  34.            $new_width = $width/$new_ratio;
  35.        }
  36.    }
  37.  
  38.    // tworzenie obrazka
  39.    $image_p = imagecreatetruecolor($new_width, $new_height);
  40.    $image_f = imagecreatetruecolor($desired_width, $desired_height);
  41.    
  42.    // kolor ramki
  43.    if(isset($border_color)){        
  44.        $ca = sscanf($border_color, '%2x%2x%2x');
  45.    
  46.        $border_color = imagecolorallocate($image_f, $ca[0], $ca[2], $ca[2]);
  47.    }
  48.    else{
  49.        $border_color = imagecolorallocate($image_f, 128, 128, 128);
  50.    }
  51.    
  52.    // tlo obrazka    
  53.    if(isset($background)){        
  54.        $ca = sscanf($background, '%2x%2x%2x');
  55.    
  56.        $color = imagecolorallocate($image_p, $ca[0], $ca[2], $ca[2]);
  57.    }
  58.    else{
  59.        $color = imagecolorallocate($image_p, 255, 255, 255);
  60.    }
  61.    
  62.    imagefill($image_f, 0, 0, $border_color);
  63.    imagefill($image_p, 0, 0, $color);
  64.    
  65.    
  66.    // jesli nie gif to sproboj jpg
  67.    if(!$image = @imagecreatefromgif($filename)){
  68.        $image = @imagecreatefromjpeg($filename);
  69.    }
  70.    $image =
  71.    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
  72.  
  73.    // Adjust position
  74.    switch($position)
  75.    {
  76.        case("topleft"):
  77.            $x = $bordersize;
  78.            $y = $bordersize;
  79.            break;
  80.          
  81.        case("topright"):
  82.            $x = $new_width - $desired_width + $bordersize;
  83.            $y = $bordersize;
  84.            break;
  85.      
  86.        case("bottomleft"):
  87.            $x = $bordersize;
  88.            $y = $new_height - $desired_height + $bordersize;
  89.            break;
  90.      
  91.        case("bottomright"):
  92.            $x = $new_width - $desired_width + $bordersize;
  93.            $y = $new_height - $desired_height + $bordersize;
  94.            break;
  95.      
  96.        case("center"):
  97.            $x = ($new_width - $desired_width) / 2 + $bordersize;
  98.            $y = ($new_height - $desired_height) / 2 + $bordersize;
  99.            break;
  100.    }
  101.  
  102.    imagecopyresampled($image_f, $image_p, $bordersize, $bordersize, $x, $y,    $desired_width    - 2 * $bordersize,
  103.                                                                                $desired_height    - 2 * $bordersize,
  104.                                                                                $desired_width    - 2 * $bordersize,
  105.                                                                                $desired_height    - 2 * $bordersize);
  106.  
  107.    return $image_f;
  108. }
  109.  
  110. $picture = $_GET['f'];
  111. $width = $_GET['w'];
  112. $height = $_GET['h'];
  113. $border = $_GET['b'];
  114. $quality = $_GET['q'];
  115. $background = $_GET['c'];
  116. $border_color = $_GET['bc'];
  117. $constrain_proportions = $_GET['cp'];
  118.  
  119. if($quality == null){
  120.    $quality = 70;
  121. }
  122.  
  123. if($picture != null){
  124.        $image_f = imagecopyresampledselection($picture, $width, $height, $border, "center", $background, $border_color, $constrain_proportions);
  125.        header('Content-type: image/jpeg');
  126.        imagejpeg($image_f, null, $quality);
  127. }
  128.  
  129. ?>


a oto jego wynik (z zastosowaniem zachownaia proporcji):

klik

a tu wynik bez zachowania proporcji, z przycinaniem:

klik2

jak usunac czarne tlo?

i czy moge wywolywac skrypt np jako

<img src="adsad234rsfd234rffg">

zamiast

<img src="thumb.php?f=plik.jpg&h=300&w=300>

moglbym dekodowac link base64 ale wtedy powstaje problem jak zagniezdzic taki obrazek w htmlu?

ma ktos jakis pomysl co do obu tych problemow?

moze ktos pomoze?
megawebmaster
Co znaczy usunąć czarne tło? Nadaj po prostu normalne wymiary (czyt. razem z proporcjami). Do tego nie da się skryptu wywoływać w ten pierwszy sposób. Musi być to drugie.
johnnyjp
co do drugiej kwestii juz wiem co i jak, natomiast pozostaje problem czarnego tla. nie chce zmieniac rozmiarow obrazka, chce aby skrypt mogl generowac miniatury wlasnie w taki sposob jak to sobie wymyslilem, czyli do konkretnych wymiarow. jakies pomysly?
em1X
napisałem własną bibliotekę, którą sprzedaję do manipulacji obrazem, i zastosowałem efekt, że zmniejszam proporcjonalnie najpierw obrazek następnie z centrum wycinam obrazek o żądanej wielkości
johnnyjp
to świetnie, jakbym chciał jakiegoś gotowego rozwiązania to bym użył phpthumb, a na pewno nie płacił za to smile.gif dlatego też napisałem sobie własny skrypt. może wiesz, gdzie jest błąd?
em1X
Chciałeś pomysłu jak otrzymać obraz o konkretnym rozmiarze. Innego rozwiązania nie ma.
johnnyjp
nie, kolego, nie zrozumielismy sie smile.gif wszystko dziala juz tak jak chce, pozostaje tylko kwestia czarnego tla, ktore sie tworzy podczas skalowania obrazka. ktos moze pomoc?
shark121
hmm może użyj ImageFill" title="Zobacz w manualu PHP" target="_manual przed wykonaniem jakichkolwiek akcji?
na przykład
  1. <?php
  2. ImageFill($obrazek, 0, 0, imagecolorallocate($obrazek, 255, 255, 255));
  3. ?>


edit: a nie sory ;d zobaczyłem że już to użyłeś
Kshyhoo
@johnnyjp, spróbuj tak: nowy obrazek imagecreatetruecolor" title="Zobacz w manualu PHP" target="_manual() i w nim ustalasz swoje tło (pobierz kolor pierwszego pixela ze swojego obrazka), a potem swój obrazek wklejasz za pomocą ImageCopyResampled" title="Zobacz w manualu PHP" target="_manual().
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.