Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Nakładanie obrazka w bibliotece GD
Forum PHP.pl > Forum > PHP
Piro
Witam

Chciałbym dodać swoje logo do obrazka uploadowanego na serwer ale wystąpił mały problem... Używam biblioteki GD v2 i dodając obrazek *.png na *.jpg nie działa mi skrypt... Wiem że tak nie powinno się robić ale nie mam innego sposobu. Nie chcę żeby obrazek który ma się znajdować na wrzuconym był z białymi "lukami" dlatego dałem png. Gdyby ktoś miał pomysł na to jak rozwiącać ten problem to proszę napisać.

Pozdrawiam Piro
delfinium
Pokaż ten skrypt, będzie łatwiej coś powiedzieć. Ogólnie w GD będzie ciężko zrobić obsługę przeźroczystości ale nie jest to niemożliwe.
dadexix
musisz najpierw w GD zmienic typ na png a nie tak po prostu sobie dodawac png na jpg...
sowiq
Cytat(delfinium @ 22.09.2008, 12:55:36 ) *
Ogólnie w GD będzie ciężko zrobić obsługę przeźroczystości ale nie jest to niemożliwe.


Bredzisz. PNG śmigają w GD aż miło. Działają przezroczystości i kanały alpha. Na localhoście mam wersję 2.0.28 i wszystko jest OK.

@autor,
musiałeś zrobić błąd w skrypcie.
Wklej go tutaj, to pomożemy winksmiley.jpg
dadexix
Cytat(sowiq @ 22.09.2008, 13:52:59 ) *
Bredzisz. PNG śmigają w GD aż miło. Działają przezroczystości i kanały alpha. Na localhoście mam wersję 2.0.28 i wszystko jest OK.

@autor,
musiałeś zrobić błąd w skrypcie.
Wklej go tutaj, to pomożemy winksmiley.jpg


Zależy co chcesz zrobic, bo np. z rozmyciem w GD na przezroczu moze byc ciezko...
delfinium
Sowiq przeczytaj dokładniej posta. On nie robi PNG tylko nakłada PNG na JPGa a w JPGu przeźroczystości nie znajdziesz (poza JPEG 2000). Kiedyś coś takiego robiłem i trochę kombinacji wymagało takie połączenie żeby na JPG skopiować PNG z wykasowaniem tła PNG.
sowiq
Autor napisał:
Cytat
Chciałbym dodać swoje logo do obrazka uploadowanego na serwer [...]
Odpowiadałem na temat, więc brałem pod uwagę takie zastosowanie.

@delfinium,
przeczytałem dokładnie. Ty powinieneś zrobić to chyba jeszcze raz smile.gif Masz JPG i półprzezroczystego PNG. Otwierasz oba obrazki, nakładasz PNG na JPG i zapisujesz jako JPG. Efekt jest taki, że masz plik JPG bez przezroczystości, ale na nim coś w stylu warstwy zakrywającej w jakimś stopniu obraz. Ale tak na prawdę to są pixele w innym kolorze, a nie półprzezroczystość.
dadexix
@delfinium, ale autor nie mowil że ma to byc zapisane właśnie w JPG, więc łatwiej zmienic format na png i robic na png które obsługuje kanał alpha

Edit: jeśli nie ma potrzeby by były miejsca z przeźroczystością(mamy obraz jpg i chcemy zapisac na niego obrazek z przeźroczystoscia ale na koncowym obrazku nie musi byc miejsc przezroczystych) to mozna w jpg zapisac - konwersja na png, nalozenie obrazka,(tutaj nie wiem, moze bedzie potrzeba zapisac to do "cache", otworzyc i wykasowac) i konwersja do jpg
delfinium
@Dadexix - zgadza się, to chyba najłatwiejsze rozwiązanie. Ale ja brałem pod uwagę kwestię dokładnie tak jak to autor posta napisał i wiem, że takie coś jest możliwe - lecisz po każdym pixelu PNG i sprawdzasz czy jest ustawiony kanał alpha (lub jest to kolor jaki chcesz wyrzucić + jakaś tolerancja ) i w to miejsce wkładasz pixel z JPGa, ale i tak to najlepiej nie wychodzi, krawędzie czasem są poszarpane i dla dużych rozmiarów PNG to wymaga trochę obliczeń.
sowiq
Ehh...
Przykład: http://www1.istockphoto.com/file_thumbview...strike-road.jpg

Umieszczenie logo zapisanego do PNG na obrazek JPG w prawym, dolnym rogu (zakładamy, że logo jest mniejsze od fotki):

  1. <?php
  2. // $znaczek - ścieżka do logo w PNG, $plik - scieżka do obrazka JPG.
  3.        header("Content-Typ: image/jpeg");
  4.    $image1 = imagecreatefrompng( $znaczek ); // importujemy plik png ze znakiem
  5.    $image2 = imagecreatefromjpeg( $plik ); // otwieramy plik jpg, na którym ma być naklejony znaczek
  6.    $plik_w = imagesx( $image2 ); // szerokość pliku
  7.    $plik_h = imagesy( $image2 ); // wysokość pliku
  8.    $znaczek_w = imagesx( $image1 ); // szerokość znaczka
  9.    $znaczek_h = imagesy( $image1 ); // wysokość znaczka
  10.  
  11.    $od_x = $plik_w - $znaczek_w;
  12.    $od_y = $plik_h - $znaczek_h;
  13.  
  14.    imagecopy( $image2, $image1, $od_x, $od_y, 0, 0, $znaczek_w, $znaczek_h );
  15.    imagejpeg( $image2, '', 95 );
  16.    imagedestroy( $image1 );
  17.    imagedestroy( $image2 );
  18. ?>


Można? Po cholere sobie życie komplikować, jak można robić coś szybciej i lepiej?

[edit]
A literówki porobił mechanizm forum :]
Piro
Oto skrypt:
  1. <?php
  2. Oto skrypt<span style="color: #007700":
  3. [PHP]
  4.    if($ext == jpg || $ext == jpeg){
  5.            $logo_path = 'galeria/logo.png';
  6.            $logo_mini_path = 'galeria/logo2.png';
  7.            $img = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/zdjecie$i.$ext");
  8.            $width  = imagesx($img);
  9.              $height = imagesy($img);
  10.              echo "<br/>$width&nbsp: $height<br/>";
  11.              if($width > 1024 || $height > 1024){
  12.                  if ($width > $height){
  13.                     $x = 1024/$width;
  14.                     echo "<br/>$x<br/>";
  15.                     $width_mini = $width * $x;
  16.                     $height_mini = $height * $x;
  17.                     echo "<br/>$width_mini&nbsp: $height_mini<br/>";
  18.                     $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  19.                    imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini ,                         $height_mini, $width  , $height);
  20.                    imagejpeg($img_mini, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_full.$ext", 80);
  21.                    $logo_full = imagecreatefrompng( $logo_path );
  22.                   $zdjecie_po = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_full.$ext");
  23.                    imagecopy($zdjecie_po, $logo_full, 80, 80, 0, 0, $width_mini ,                         $height_mini);
  24.                    imagejpeg($zdjecie_po, '', 80);
  25.                    imagedestroy($img_mini);
  26.                    $y = 100/$width;
  27.                     echo "<br/>$y<br/>";
  28.                     $width_mini2 = $width * $y;
  29.                     $height_mini2 = $height * $y;
  30.                     echo "<br/>$width_mini2&nbsp: $height_mini2<br/>";
  31.                     $img_mini2 = imagecreatetruecolor($width_mini2, $height_mini2);
  32.                    imagecopyresampled($img_mini2, $img, 0, 0, 0, 0, $width_mini2 ,                         $height_mini2, $width  , $height);
  33.                    imagejpeg($img_mini2, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext", 80);
  34.                    $logo_mini = imagecreatefrompng( $logo_mini_path );
  35.                   $zdjecie_po2 = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext");
  36.                    imagecopy($zdjecie_po2, $logo_mini, 15, 15, 0, 0, $width_mini2 ,                         $height_mini2);
  37.                    imagejpeg($zdjecie_po2, '', 80);
  38.                    imagedestroy($img);
  39.                    imagedestroy($img_mini2);
  40.                 } else {
  41. ?>

W następnym poście cd...
Jeżeli któreś zmienne potrzebują objaśnienie to proszę pytać...

$userdata['username'] - trzyma nazwę użytkownika pobraną z phpbb
$f - kolejna liczba która ma zostać przypisana folderowi

CD.. skryptu
  1. <?php
  2. $x = (1024/$height);
  3.                      $width_mini = $width * $x;
  4.                      $height_mini = $height * $x;
  5.                      $img_mini = imagecreatetruecolor($width_mini, $height_mini);
  6.                     imagecopyresampled($img_mini, $img, 0, 0, 0, 0, $width_mini ,                             $height_mini, $width  , $height);
  7.                     imagejpeg($img_mini, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_full.$ext", 80);
  8.                     $logo_full = imagecreatefrompng( $logo_path );
  9.                    $zdjecie_po = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_full.$ext");
  10.                     imagecopy($zdjecie_po, $logo_full, 80, 80, 0, 0, $width_mini ,                         $height_mini);
  11.                     imagejpeg($zdjecie_po, '', 80);
  12.                     imagedestroy($img_mini);
  13.                     $y = 100/$height;
  14.                      echo "<br/>$y<br/>";
  15.                      $width_mini2 = $width * $y;
  16.                      $height_mini2 = $height * $y;
  17.                      echo "<br/>$width_mini2&nbsp: $height_mini2<br/>";
  18.                      $img_mini2 = imagecreatetruecolor($width_mini2, $height_mini2);
  19.                     imagecopyresampled($img_mini2, $img, 0, 0, 0, 0, $width_mini2 ,                         $height_mini2, $width  , $height);
  20.                     imagejpeg($img_mini2, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext", 80);
  21.                     $logo_mini = imagecreatefrompng( $logo_mini_path );
  22.                    $zdjecie_po2 = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext");
  23.                     imagecopy($zdjecie_po2, $logo_mini, 15, 15, 0, 0, $width_mini2 ,                         $height_mini2);
  24.                     imagejpeg($zdjecie_po2, '', 80);
  25.                     imagedestroy($img);
  26.                     imagedestroy($img_mini2);
  27.                  }
  28.              } else {
  29.                  if ($width > $height){
  30.                      $y = 100/$width;
  31.                      echo "<br/>$y<br/>";
  32.                      $width_mini2 = $width * $y;
  33.                      $height_mini2 = $height * $y;
  34.                      echo "<br/>$width_mini2&nbsp: $height_mini2<br/>";
  35.                      $img_mini2 = imagecreatetruecolor($width_mini2, $height_mini2);
  36.                     imagecopyresampled($img_mini2, $img, 0, 0, 0, 0, $width_mini2 ,                         $height_mini2, $width  , $height);
  37.                     imagejpeg($img_mini2, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext", 80);
  38.                     $logo_mini = imagecreatefrompng( $logo_mini_path );
  39.                    $zdjecie_po2 = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext");
  40.                     imagecopy($zdjecie_po2, $logo_mini, 15, 15, 0, 0, $width_mini2 ,                         $height_mini2);
  41.                     imagejpeg( $zdjecie_po2, '', 80);
  42.                     imagedestroy($img);
  43.                     imagedestroy($img_mini2);
  44.                  } else {
  45. ?>


To jest tylko fragment odpowiedzialny za tworzenie i dodawanie loga...

  1. <?php
  2. $y = 100/$height;
  3.                      echo "<br/>$y<br/>";
  4.                      $width_mini2 = $width * $y;
  5.                      $height_mini2 = $height * $y;
  6.                      echo "<br/>$width_mini2&nbsp: $height_mini2<br/>";
  7.                      $img_mini2 = imagecreatetruecolor($width_mini2, $height_mini2);
  8.                     imagecopyresampled($img_mini2, $img, 0, 0, 0, 0, $width_mini2 ,                         $height_mini2, $width  , $height);
  9.                     imagejpeg($img_mini2, "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext", 80);
  10.                     $logo_mini = imagecreatefrompng( $logo_mini_path );
  11.                    $zdjecie_po2 = imagecreatefromjpeg("galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_mini.$ext");
  12.                     imagecopy($zdjecie_po2, $logo_mini, 15, 15, 0, 0, $width_mini2 ,                         $height_mini2);
  13.                     imagejpeg($zdjecie_po2, '', 80);
  14.                     imagedestroy($img);
  15.                     imagedestroy($img_mini2);
  16.                  }
  17.                  rename ("galeria/".$userdata['username']."/galeria".$f."/zdjecie$i.$ext", "galeria/".$userdata['username']."/galeria".$f."/$nazwa2"."_full.$ext");
  18.              }
  19. ?>


To już koniec... jeżeli ktoś chce zobaczyć cały to proszę powiedzieć to gdzieś go udostępnie...
sowiq
No kolego... Jak Ty robisz
  1. <?php
  2. imagejpeg($zdjecie_po, '', 80);
  3. ?>


a kilka linijek dalej:

  1. <?php
  2. echo "<br/>$y<br/>";
  3. ?>


to się nie dziw, że nie działa smile.gif Albo drukujesz obrazek, albo tekst. I jeśli obrazek, to ustaw odpowiedni nagłówek.
Piro
Pisałem ten skrypt od początku ale nie mam pojęcia jak ma się $y do zdjęcia (oprócz tego że to stosunek boków)?

i gdzie mam header wstawić bo przyznam się że w GD siedzę dopiero od tygodnia...

________________________________________________________________________________

DODANE:

Już problem rozwiązany... nie był on w skrypcie z obrazkiem tylko w skrypcie przenoszącym ten obrazek do innego folderu (przenosił starą wersję jeszcze przed naniesieniem png)...

sowiq masz + (za zmuszenie do myślenia)
sowiq
Przyjrzyj się na kod, który wkleiłem kilka postów wcześniej. Jeśli wrzucisz to do funkcji, usuniesz header(...) i zamiast imagejpeg( $image2, '', 95 ) dasz imagejpeg( $image2, $sciezka, 95 ) to pod ścieżką $sciezka będziesz miał zapisany obrazek JPG z nałożonym logo.

Jeśli do tego dorzucisz kawałek kodu odpowiedzialny za zmianę rozmiaru, to masz już wszystko, co Ci potrzebne smile.gif

Powodzenia winksmiley.jpg

[edit]
czyli nieaktualne już
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.