Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie obrazka z innych obrazków
Forum PHP.pl > Forum > PHP
busterek
Witajcie.
Mam dośc poważny problem, bo jeszcze nigdy z czymś takim nie miałem do czynienia. Otóż mam kilka obrazków, powiedzmy 3-4 stałe i reszta innych wskazywanych. Innymi słowy mówiąc chciałbym generować miniaturkę produktu na allegro. smile.gif. Ale czasami na miniaturce jest jedno zdjęcie produktu, a czasami 3 lub więcej. Jak stworzyć z tych obrazków jednego jpg, ale tak żeby produkt był pod wszystkimi innymi warstwami?
werek
za pomoca getimagesize sprawdzasz wymiary poszczegolnych obrazow potem tworzysz czysty obraz o wymiarach które pomieszcza te wszystkie. to tak w skrocie, oczywiscie bedziesz musial jeszcze skopiowac jest na ten stworzony.

zalezy jeszcze w jakiej orientacji ma byc ten docelowy obraz

poniżej prosta klaska napisana na szybko która obrazuje pomysł o którym mówię. wymaga przejzenia i poprawek poniewaz nie obsługuje wszystkich przypadkow, przede wszystkim walidacja, mozna by też dodać jakas metode do miniaturek tak aby mozna było tworzyć z duzych wersji małe tak aby dodawać miniaturki (tego akurat pełno w necie).

klasa nie nadaje się do zastosowania produkcyjnego, stworzona tylko w celu demonstracji koncepcji

  1. <?php
  2. class MultiImage {
  3. protected $_options=array(
  4. 'images'=>array(),
  5. 'max_width'=>1600
  6. );
  7. public function __construct($options=array()){
  8. if (is_array($options)) {
  9. $this->_options=array_merge($this->_options,$options);
  10. }
  11. }
  12. public function build($saveTo=null){
  13. //rozmiary docelowego obrazu
  14. $outputWidth=0;
  15. $outputHeight=0;
  16. //offset do przeliczenia wlasciwej wysokosci
  17. $lastRow=0;
  18.  
  19. //teraz obliczamy wymiary właściwego obrazu i rozkład obrazów
  20. $layout=array();
  21. foreach ($this->_options['images'] as $path) {
  22. $t=getimagesize($path);
  23. if (($t[0]+$outputWidth) > $this->_options['max_width']) {
  24. $layout[count($layout)][]=$path;
  25. $newRow=TRUE;
  26. } else {
  27. $layout[count($layout)-1][]=$path;
  28. $outputWidth+=$t[0];
  29. }
  30. if ($newRow) {
  31. $lastRow=$outputHeight;
  32. $outputHeight+=$t[1];
  33. } else {
  34. if (($t[1]+$lastRow) > $outputHeight) {
  35. $outputHeight=$t[1]+$lastRow;
  36. }
  37. }
  38. }
  39.  
  40. //czysty resource naszego pustego obrazu
  41. $newImage=imagecreatetruecolor($outputWidth, $outputHeight);
  42.  
  43. //tutaj mozna pododawac jakies dodatkowe przygotowania
  44. //np. pokolorować tło
  45.  
  46. //teraz przechodzimy do właściwego kopiowania obrazów na nowy
  47. $offsetX=1;
  48. $offsetY=1;
  49. $lastRow=0;
  50. foreach ($layout as $row) {
  51. $offsetX=1;
  52. foreach ($row as $path) {
  53. $t=getimagesize($path);
  54. switch ($t[3]) {
  55. case IMAGETYPE_GIF:
  56. $image=imagecreatefromgif($path);
  57. break;
  58. case IMAGETYPE_PNG:
  59. $image=imagecreatefrompng($path);
  60. break;
  61. case IMAGETYPE_JPEG:
  62. $image=imagecreatefromjpeg($path);
  63. break;
  64. }
  65. imagecopyresampled($newImage, $image, $$offsetX, $offsetY, 1, 1, $t[0], $t[1], $t[0], $t[1]);
  66. $offsetX+=$t[0];
  67. if ($t[1] > $lastRow) {
  68. $lastRow=$t[1];
  69. }
  70. }
  71. $offsetY+=$lastRow;
  72.  
  73. }
  74.  
  75. //zapisujemy na dysk albio zwracamy do dalszej obróbki
  76. if (!is_null($saveTo)) {
  77. imagejpeg($newImage,$saveTo);
  78. } else {
  79. return $newImage;
  80. }
  81. }
  82. }



przykład zastosowania:

  1. $opcje=array(
  2. 'max_width'=>800,
  3. 'images'=>array(
  4. '/tmp/image1.png',
  5. '/tmp/image2.jpg',
  6. '/tmp/image2.gif',
  7. '/tmp/image4.png'
  8. )
  9. );
  10. $savePath='/tmp/nowy.jpg';
  11. $mm=new MultiImage($opcje);
  12. $mm->build($savePath);
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.