Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] imagecopyresampled
Forum PHP.pl > Forum > PHP
fernet
Witam,

Popełniłem skrypt który ma za zadanie dopasować ładowane zdjęcie do odpowiedniej rozdzielczości. W pierwszej fazie leci skalowanie z zachowaniem proporcji wysokość/szerokość a później jeśli coś po katach wystaje leci kadrowanie z pozycji x czy tez y o przypadkowej mniejszej wartości roznicy. W wiekszosci przypadkow skrypt dzala jednak jest gdzes jest blad i nie moge go znalesc a objawia sie tym ze czasem zdjecia w swojej dolnej czesci sa sciete o jakas przypadkowa wysokosc.


  1. $pic = @imagecreatefrompng($id_thumb);
  2. $mega = $mega_path;
  3. $width = imagesx($pic);
  4. $height = imagesy($pic);
  5. $cat_x = 0;
  6. $cat_y = 0;
  7.  
  8.  
  9. if($height == $width) {
  10. $Twidth = 330;
  11. $Theight = $Twidth * $height / $width;
  12. $Theight = ceil($Theight);
  13. $cat_y = rand(0,$Theight-286);
  14. } else {
  15. if($height < $width) {
  16. $Theight = 286;
  17. $Twidth = $Theight * $width / $height;
  18. $Twidth = ceil($Twidth);
  19. if($Twidth < 330) {
  20. $Twidth = 330;
  21. $Theight = $Twidth * $height / $width;
  22. $Theight = ceil($Theight);
  23. } else {
  24. $cat_x = rand(0,$Twidth-330);
  25. }
  26. } else {
  27. $Twidth = 330;
  28. $Theight = $Twidth * $height / $width;
  29. $Theight = ceil($Theight);
  30. if($Theight < 286) {
  31. $Theight = 286;
  32. $Twidth = $Theight * $width / $height;
  33. $Twidth = ceil($Twidth);
  34. } else {
  35. $cat_y = rand(0,$Theight-286);
  36. }
  37. }
  38. }
  39. $thumb = @imagecreatetruecolor (330, 286);
  40. imagealphablending($thumb, false);
  41. imagesavealpha($thumb,true);
  42. $transparent = imagecolorallocatealpha($thumb, 255, 255, 255, 127);
  43. imagefilledrectangle($thumb, 0, 0, $Twidth, $Theight, $transparent);
  44. imagecopyresampled($thumb, $pic, 0, 0, $cat_x, $cat_y, $Twidth, $Theight, $width, $height);
  45. imagepng($thumb,$mega);
  46. imagedestroy($thumb);
  47. unlink($target_path);
  48.  



Za pomoc i zainteresowaie z gory dziekuje i pozdrawiam
Uriziel01
Ja jestem tylko ciekaw czy wiesz że jesteś pewnie już dziesięcio tysięczną osobą na świecie która 'popełniła' właśnie taki kod (tzn. rozwiązujący ten problem), nie rozumiem dlaczego wszyscy piszą to na własną rękę ? Z całym szacunkiem tutaj masz przykładową klasę realizującą dokładnie te zadanie, użyj jej tak jak jest, lub jeżeli już naprawde nie możesz się oderwać od programowania strukturalnego no to skorzystaj z samej zawartości tych metod i przepisz je do swojego kodu:
  1. class SimpleImage {
  2.  
  3. var $image;
  4. var $image_type;
  5.  
  6. function load($filename) {
  7.  
  8. $image_info = getimagesize($filename);
  9. $this->image_type = $image_info[2];
  10. if( $this->image_type == IMAGETYPE_JPEG ) {
  11.  
  12. $this->image = imagecreatefromjpeg($filename);
  13. } elseif( $this->image_type == IMAGETYPE_GIF ) {
  14.  
  15. $this->image = imagecreatefromgif($filename);
  16. } elseif( $this->image_type == IMAGETYPE_PNG ) {
  17.  
  18. $this->image = imagecreatefrompng($filename);
  19. }
  20. }
  21. function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
  22.  
  23. if( $image_type == IMAGETYPE_JPEG ) {
  24. imagejpeg($this->image,$filename,$compression);
  25. } elseif( $image_type == IMAGETYPE_GIF ) {
  26.  
  27. imagegif($this->image,$filename);
  28. } elseif( $image_type == IMAGETYPE_PNG ) {
  29.  
  30. imagepng($this->image,$filename);
  31. }
  32. if( $permissions != null) {
  33.  
  34. chmod($filename,$permissions);
  35. }
  36. }
  37. function output($image_type=IMAGETYPE_JPEG) {
  38.  
  39. if( $image_type == IMAGETYPE_JPEG ) {
  40. imagejpeg($this->image);
  41. } elseif( $image_type == IMAGETYPE_GIF ) {
  42.  
  43. imagegif($this->image);
  44. } elseif( $image_type == IMAGETYPE_PNG ) {
  45.  
  46. imagepng($this->image);
  47. }
  48. }
  49. function getWidth() {
  50.  
  51. return imagesx($this->image);
  52. }
  53. function getHeight() {
  54.  
  55. return imagesy($this->image);
  56. }
  57. function resizeToHeight($height) {
  58.  
  59. $ratio = $height / $this->getHeight();
  60. $width = $this->getWidth() * $ratio;
  61. $this->resize($width,$height);
  62. }
  63.  
  64. function resizeToWidth($width) {
  65. $ratio = $width / $this->getWidth();
  66. $height = $this->getheight() * $ratio;
  67. $this->resize($width,$height);
  68. }
  69.  
  70. function scale($scale) {
  71. $width = $this->getWidth() * $scale/100;
  72. $height = $this->getheight() * $scale/100;
  73. $this->resize($width,$height);
  74. }
  75.  
  76. function resize($width,$height) {
  77. $new_image = imagecreatetruecolor($width, $height);
  78. imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
  79. $this->image = $new_image;
  80. }
  81.  
  82. }
fernet
Ja po prostu wole vi na rzecz innych dyrdymałów a co do programowania obiektowego to absolutnie masz racje i teraz niestety muszę mój panel administracyjny zmienić z quake'a na Battlefield'a 3 - nie "opóźniaj towarzyszy" itd...

Pozdrawiam
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.