Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: GD / Rozmiar obrazu przed wyśietleniem
Forum PHP.pl > Forum > PHP
deejay4net
Witam, nie wiem czemu ale wydaje mi się że to głupie pytanie
tym bardziej że pisaniem skryptów zajmuję się nie od dziś.
Nie mogę sprawdzić rozmiaru przetworzonego obrazu w GD.

mam oto taki kod
  1. <?php
  2. $newImage = imagecreatetruecolor( $userWidth , $userHeight );
  3. $tmpImage = imagecreatefromjpeg ( $_FILES['image']['tmp_name'] );
  4. imagecopyresampled( $newImage , $tmpImage, 0, 0, 0, 0, ( ( $width > $userWidth ) ? $userWidth : $width ), ( ( $height > $userHeight ) ? $userHeight : $height ), $width, $height );
  5. ?>


nie przychodzi mi w tym miejscu do głowy żadna funkcja która zwróci mi rozmiar obrazu
znajdującego się w $newImage .
Możliwe że to tylko przemęczenie ale proszę o szybką podpowiedź smile.gif
dotangelo
Jak już zapiszesz ten plik, to możesz:
  1. <?php
  2. getimagesize('filename');
  3. ?>


Oprócz tego sprawdź czy GD w ogóle udostępnia funkcję pozwalające sie dowiedzieć rozmiar obrazka. Wydaje mi się że powinno smile.gif
deejay4net
Cytat(dotangelo @ 24.07.2009, 15:19:38 ) *
  1. <?php
  2. getimagesize('filename'[/b]);
  3. ?>


Jak wskazuje parametr jest to nazwa pliku , btw to zwraca szerokość, wysokość i typ mime,
ja potrzebuje rozmiar w bajtach , bitach cokolwiek z dzieleniem i mnożeniem sobie poradzę przecież smile.gif

No i wracając dalej parametrem tej funkcji jest string a [b]imagecreatetruecolor
zwraca [b]resource
dlatego nie mam pojęcia jak to ugryźć a potrzebuje tego rozmiaru przed wyświetleniem pliku sad.gif
john_doe
http://pl.php.net/filesize
maly_swd
a przez przypadek GD w $newImage nie trzyma danych w formacie pseodu BMP... czyli nieskompresowane. 1 px to 3 bajty?

mozesz zawsze przechwycic przez OB_.. to co zwraca imagejpeg($newImage); i sprawdzic przez count() ile ma znakow:)
Darti
  1. <?php
  2. function getNeededMemoryForImageCreate($width, $height, $truecolor) {
  3.  return $width*$height*(2.2+($truecolor*3));
  4. }
  5. ?>


kod zaczęrnięty z manuala: http://pl2.php.net/manual/pl/function.imag...color.php#66975
zmienna $truecolor ma chyba wartości 0 lub 1
deejay4net
Cytat(Darti @ 24.07.2009, 16:31:25 ) *
  1. <?php
  2. function getNeededMemoryForImageCreate($width, $height, $truecolor) {
  3.  return $width*$height*(2.2+($truecolor*3));
  4. }
  5. ?>


kod zaczęrnięty z manuala: http://pl2.php.net/manual/pl/function.imag...color.php#66975
zmienna $truecolor ma chyba wartości 0 lub 1


Użyłem funkcji i teraz tak.. zwróciła mi wartość 41600000
z pliku który przyjął rozmiar 921 Kb

użyłem w sposób
  1. <?php
  2. getNeededMemoryForImageCreate( imagesx($newImage),imagesy($newImage),1 )
  3. ?>



gdy użyłem zera jako ostatniego parametru otrzymałem 17600000

Wydaje mi się że nie to chciałem otrzymać ;D
erix
Właśnie to.

To że plik ma rozmiar mniejszy od wartości wyliczonej, to tylko wynik zastosowanej kompresji. Pamięć na obraz liczona jest w BITMAPIE.

Zapisz sobie ten sam obrazek w formacie BMP, wtedy będziesz wiedział, ile trzeba pamięci. >:>
deejay4net
wnioskuję to że niepotrzebna debata się stwarza ;D Bo o to chodzi że ja przed zapisem muszę znać ten rozmiar. Żeby wiedziec czy optymalizować go dalej czy zapisywać na serwerze.. smile.gif
maly_swd
Przeczytaj co napisalem wczesniej:

...mozesz zawsze przechwycic przez OB_.. to co zwraca imagejpeg($newImage); i sprawdzic przez count() ile ma znakow:)

tu masz wpis:
http://forum.php.pl/index.php?s=&showt...st&p=622539

wystarczy go zmienic:

  1. <?php
  2. $d=imagecreatefromjpeg('tapeta.jpg');
  3.  
  4. imagejpeg($d);
  5. $con=ob_get_clean();
  6. echo strlen($con);
  7. ?>
Darti
a może tak : ?
  1. <?php
  2. echo 'memory_get_usage: '.memory_get_usage()."<br>";
  3. $d=imagecreatefromjpeg('t.jpeg');
  4. echo 'memory_get_usage: '.memory_get_usage()."<br>";
  5. unset($d);
  6. echo 'memory_get_usage: '.memory_get_usage()."<br>";
  7. ?>
erix
Ok, ale to Ci nie zwróci wagi skompresowanego obrazka. tongue.gif
deejay4net
  1. <?php
  2. imagejpeg($d);
  3. ?>


Nie bardzo smile.gif

Bo ja mam taki kod końcowy który wyrzuca mi pobieranie więc nie mogę wysyłać niczego przed tym

  1. <?php
  2. @header("Content-type: {$mime}");
  3.                @header("Content-Disposition: attachment; filename=\"{$filename} (Wygenerowane przez {$settings['servis_name']}) Quality {$q}.{$extension}\"");
  4.                imagejpeg( $newImage , null , $quality );
  5. ?>


gdzie $newImage musi być już poprawnym obrazem dopasowanym do odpowiedniej wielkości. No tak jak napisałem wyżej.

Cytat
Bo o to chodzi że ja przed zapisem muszę znać ten rozmiar


Czyli to w sumie kompresja GD ale bardziej pod kątem wagi pliku niż pod rozmiar. Bo zmniejszenie rozmiaru nie zawsze daje nam odpowiedni rozmiar smile.gif

No chyba że zacznę obliczać zmniejszając szerokość i jakość proporcjonalnie według określonego percenta ;D
Ok dzisiaj na świeżo luknę i dam znać czy coś zdziałałem smile.gif
maly_swd
przeczytaj to ze zrozumieniem i dostosuj do tego co masz u siebie. Ten sposob zadziala na 1000%

  1. <?php
  2. $d=imagecreatefromjpeg('tapeta.jpg');
  3.  
  4. imagejpeg($d);
  5. $con=ob_get_clean();
  6. echo strlen($con);
  7. ?>



// wstawiając kod używaj BBCode
// ayeo
wookieb
Cytat(maly_swd @ 25.07.2009, 18:54:52 ) *
Ten sposob zadziala na 1000%


O jezu... żałosne... nawet nie sprawdziłeś
  1. <?php
  2. $img=imagecreatefromjpeg('foto_main.jpg');
  3.  
  4. imagejpeg($img);
  5. $contents=ob_get_clean();
  6. echo "Ilość znaków: ".strlen($contents)."\n";
  7. echo "Rozmiar: ".filesize('foto_main.jpg')."\n";
  8. ?>


Masz swój 1000% wynik
Kod
Ilość znaków: 13477
Rozmiar: 61460

No chyba, że zamiast % chciałes napisać promile a to inna sprawa.
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.