Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][gd] Problem z tworzeniem miniatur
Forum PHP.pl > Forum > Przedszkole
kazag
Witam ponownie,
mam skrypt tworzący miniatury z wczesniej wysłanych na serwer obrazków. Miniatury są tworzone w ten sposób, że z oryginalnego obrazka wycinany jest fragment o wysokosci i szerokosci ustalonej (wiec to własciwie nie miniatura, a fragment obrazka). Mam do tego taki skrypt:
  1. <?php
  2. //pobieram zmienną
  3. $obrazek="img/arts/".$_GET['o'];
  4.  
  5. //ustalam wysokosci i szerokosc miniatury
  6. if(!$ms)
  7. $ms=250;
  8. if(!$mw)
  9. $mw=143;
  10.  
  11. //pobieram dane obrazka
  12. $rozmiar=GetImageSize($obrazek);
  13. $szer=$rozmiar[0];
  14. $wys=$rozmiar[1];
  15.  
  16. //miniaturuje ;p
  17.  
  18. if($_FILES['obrazek']['type']='png')
  19. {
  20. $zrd = ImageCreateFromPng($obrazek);
  21. $prz = ImageCreate($ms,$mw);
  22. imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
  23. header('Content-type: image/jpeg');
  24. ImageJpeg($prz, null, 100);
  25. ImageDestroy($zrd);
  26. ImageDestroy($prz);
  27. }
  28. else
  29. {
  30. $zrd = ImageCreateFromJpeg($obrazek);
  31. $prz = ImageCreate($ms,$mw);
  32. imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
  33. header('Content-type: image/jpeg');
  34. ImageJpeg($prz, null, 100);
  35. ImageDestroy($zrd);
  36. ImageDestroy($prz);
  37. }
  38. ?>


Problem w tym, że ongiś skrypt działał, a dziś nie... (nie pamietam, może coś zmieniałem, ale to mało istotne, ważne, że teraz nie działa). Zamiast obrazka .jpg dostaje jedynie tekst alternatywny, a zamiast .png dostaje czarny prostokąt... W czym rzecz? Źle używam jakiejś funkcji? Na gd się kompletnie nie znam, ten skrypt pisałem z dużą pomocą ksiazki/manuala, wiec może coś skaszaniłem, tylko co?

aha - chmody są ustawione dla folderow, w ktorym są obrazki na 777.

Z góry dzięki za odpowiedź winksmiley.jpg
wookieb
  1. <?php
  2. $_FILES['obrazek']['type']='png'
  3. ?>

raczej ==

Poza tym sprawdź czy plik PNG napewno ma mimetype PNG

  1. <?php
  2. header('Content-type: image/jpeg');
  3. ImageJpeg($prz, null, 100);
  4. ?>

Sprawdzasz czy jest png ale i tak zwracasz go jako jpg

Poza tym nie masz dolaczonej obsługi przezroczystosci w plikach png.

Jeszcze zamiast imagecopy używaj imagecopyresampled
kazag
@up
wiem, że zwracam jako jpeg, to ma jakieś znaczenie jak go zwrócę?
imagecopyresampled mi go jakoś deformowało...

sprawdzam, czy zadziała.
Spawnm
  1. <?php
  2. if($_FILES['obrazek']['type']='png')
  3. ?>
nie zadziała ;]
powinno być 'image/png' czyli
  1. <?php
  2. if($_FILES['obrazek']['type']=='image/png')
  3. ?>
kazag
więc teraz jpegi robi miniaturki, ale kolory są...zmienione, jakby było ich mniej?

png nie ma, jest tylko tekst alternatywny.

imagecopyresampled robił złe miniatury, mam ustawione tak:
imagecopyresampled($prz, $zrd, 0, 0, 0, 0, $ms, $mw, $szer, $wys);
i robi obrazek jest spłaszczony...
Spawnm
zamiast
$prz = ImageCreate($ms,$mw);

daj

$prz = imagecreatetruecolor($ms,$mw);
wookieb
Cytat(kazag @ 25.03.2009, 11:16:53 ) *
imagecopyresampled robił złe miniatury, mam ustawione tak:
imagecopyresampled($prz, $zrd, 0, 0, 0, 0, $ms, $mw, $szer, $wys);
i robi obrazek jest spłaszczony...


No nic dziwnego skoro nie umiesz wyliczyc odpowiednich wartosci rozmiarów miniaturki
Kod
if(!$ms)
$ms=250;
if(!$mw)
$mw=143;
artur_dziocha
no jeśli uploadujesz obrazki innych rozmiarów niż podane na stało to nic dziwnego. Wysokośc i szerokość przelicz procentowo
kazag
@up i upUp
Ja rozumiem.
Ale chce mieć wycięty fragment z lewego górnego rogu... nie chce mieć miniatury z obrazu o szerokości np. 1024 px, bo to nie wyglada tak, jak powinno, chce mięc WYCIĘTY fragment.

kod wyglada tak:
Kod
<?php
$obrazek="img/arts/".$_GET['o'];

if(!$ms)
$ms=250;
if(!$mw)
$mw=143;

$rozmiar=GetImageSize($obrazek);
$szer=$rozmiar[0];
$wys=$rozmiar[1];

if($_FILES['obrazek']['type']=='image/png')
{
$zrd = ImageCreateFromPng($obrazek);
$prz = imagecreatetruecolor($ms,$mw);
imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
header('Content-type: image/png');
ImagePng($prz);
ImageDestroy($zrd);
ImageDestroy($prz);
}
else
{
$zrd = ImageCreateFromJpeg($obrazek);
$prz = imagecreatetruecolor($ms,$mw);
imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
header('Content-type: image/jpeg');
ImageJpeg($prz, null, 100);
ImageDestroy($zrd);
ImageDestroy($prz);
}
?>


Jpeg już działa poprawnie, pomógł dla Spawnma. Problem jeszcze tylko z png...
Spawnm
zamiast imagecopy daj imagecopyresampled
kazag
nie pomogło, ciagle dostaje jedynie tekst alternatywny, a jak wezme "pokaz obrazek" to wyswietla sie tylko link, mało tego, na belce jest napisane, ze to obrazek JPEG...

wydaje mi się więc, że problem jest z tym ifem.

rozwiązanie było banalne...plik nie był przesyłany, wiec $_FILES nic nie dawało...
wyglada to tak:
Kod
<?php
$obrazek="img/arts/".$_GET['o'];

if(!$ms)
$ms=250;
if(!$mw)
$mw=143;

$rozmiar=GetImageSize($obrazek);
$szer=$rozmiar[0];
$wys=$rozmiar[1];

$typ=basename($obrazek);
$pliki=explode(".", $typ);

if($pliki[1]=='png')
{
$zrd = ImageCreateFromPng($obrazek);
$prz = imagecreatetruecolor($ms,$mw);
imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
header('Content-type: image/png');
imagepng($prz);
ImageDestroy($zrd);
ImageDestroy($prz);
}
else
{
$zrd = ImageCreateFromJpeg($obrazek);
$prz = imagecreatetruecolor($ms,$mw);
imagecopy($prz, $zrd, 0, 0, 0, 0, $ms, $mw);
header('Content-type: image/jpeg');
ImageJpeg($prz, null, 100);
ImageDestroy($zrd);
ImageDestroy($prz);
}
?>


ogromne dzięki za pomoc wszystkim smile.gif
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.