Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP ( GD, Edycja obrazka, z MYSQL)
Forum PHP.pl > Forum > PHP
seba22
Witam,

Mam problem, ponieważ posiadam w bazie MYSQL, obrazek zakodowany w base64.

Wyciągam go sobie z serwera SQL i wstawiam w zmienną $contentz
  1. <?php
  2. $contentz = base64_decode($content);
  3. ?>


Ale kiedy próbuje wykonać operacje

  1. <?php
  2. $old_x=imageSX($src_img);
  3. $old_y=imageSY($src_img);
  4. ?>

Gdzie $src_img to pobrany z mysqla i zdekodowany obrazek... :/

  1. <?php
  2. Warningimagesx(: supplied argument is not a valid Image resource i
  3. ?>





Czy ma ktoś jakiś pomysł jak to rozwiązać, ewentualnie exclamation.gif!
Mam pomysł jak to obejść, ale czy ktoś może mi pomóc, jak zapisać do jpg, ten plik z mysql-a, i powiedzmy przez chwilkę przeprowadzić na nim operacje, a potem skasować ?
Exek
http://pl.php.net/manual/pl/function.image...efromstring.php

aha i nie musisz trzymac obrazkow w bazie danych zakodowanych base64, utwórz kolumnę BLOB (czy LONGBLOB już nie pamiętam) która służy do takich celów. Efekt to około 20-30% oszczędności miejsca.
seba22
Witam,

Trzymam właśnie w kolumnie Long Blob.


Spróbowałem imagefromstring, ale dalej ten sam problem mi wyskakuje.

Tak wygląda teraz fragment kodu:


  1. <?php
  2. $contento = base64_decode($content);
  3. $contento = imagecreatefromstring($contento);
  4. createthumb($contento,'./tmp/'.$losowy_ciag.'.jpg',130,130);
  5. ?>



Wysypuje błędami:



Błąd, może nie poprawny ID ?
  1. <?php
  2. Warningimagesx(: supplied argument is not a valid Image resource in xxx
  3. Warningimagesy(: supplied argument is not a valid Image resource in xxx
  4. ?>

A te linie, są wywoływane przez createthumn, w formie funkcji która CAŁA wygląda TAK !

( zaznaczam że nie jestem jej autorem) ale na plikach nie z bazy SQL działa poprawnie.

  1. <?php
  2. function createthumb($name,$filename,$new_w,$new_h){
  3.    $system=explode('.',$name);
  4.    if (preg_match('/jpg|jpeg|JPG/',$system[1])){
  5.        $src_img=imagecreatefromjpeg($name);
  6.    }
  7.    if (preg_match('/png/',$system[1])){
  8.        $src_img=imagecreatefrompng($name);
  9.    }
  10.  
  11.    
  12. $old_x=imageSX($src_img);
  13. $old_y=imageSY($src_img);
  14. if ($old_x > $old_y) {
  15.    $thumb_w=$new_w;
  16.    $thumb_h=$old_y*($new_h/$old_x);
  17. }
  18. if ($old_x < $old_y) {
  19.    $thumb_w=$old_x*($new_w/$old_y);
  20.    $thumb_h=$new_h;
  21. }
  22. if ($old_x == $old_y) {
  23.    $thumb_w=$new_w;
  24.    $thumb_h=$new_h;
  25. }
  26. $dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
  27.    imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);
  28.    
  29. if (preg_match("/png/",$system[1]))
  30. {
  31.    imagepng($dst_img,$filename);
  32. } else {
  33.    imagejpeg($dst_img,$filename);
  34. }
  35. imagedestroy($dst_img);
  36. imagedestroy($src_img);
  37. }
  38. ?>



A tak pobieram obrazek od usera:


  1. <?php
  2. $fhandle = fopen($_FILES['zdjecie']['tmp_name'], "r");
  3. $text=$_FILES['zdjecie']['name'];
  4.  
  5. $content = base64_encode(fread($fhandle, $_FILES['zdjecie']['size']));
  6. fclose($fhandle);
  7. ?>


W związku z czym mam go w base64 w zmiennej $content, i teraz tą zmienną chce wykonać miniaturkę....
I teraz chciał bym wygenerować mu miniaturkę, kodem który macie powyżej.

Może byście jeszcze na to zerkli, bo coś jest nie w porządku...
Exek
no ale popatrz się do funkcji createthumb, tam korzystasz z funkcji imagecreatefromjpg/png które za parametr chcą ścieżkę do pliku, a ty masz obrazek przechowywany w stringu.
seba22
Racja mistrzu,
Przepisałem te procedurę.

Mam jeszcze inne pytanie, bo robie potem konwersje kolorów.

I mam obrazek jpg w zmiennej $im
Chciał bym go zapisać do base64 ?
Czy można to zrobić bez zapisywania go na hdd ?

Próbowałem tak, ale niestety nie działa.

Kod
  imagejpeg($im, $miniatura);
  $miniatura=base64_encode($miniatura);
Exek
złap imagejpeg pomiędzy output buffering a potem to co złapałeś przypisz do zmiennej

hint:
ob_start(), ob_get_contents() i ob_end_clean()
seba22
Jak użyć tego parametru ?

Odgórnie, w PHP.ini ustawiłem sobie na buforowanie ( bo ciągle miałem problemy z wysyłaniem nagłówków).

Więc zamiast, stosować co chwila to buforowanie, to wrzuciłem je w bezpośrednio w dyrektywy php.
Exek
Jeśli masz problemy z wysyłaniem nagłówków (czyli tak na prawedę nie wiesz co gdzie się dzieje), to (nie obraź się) Twój kod jest o kant dupy potłuc. tongue.gif

A jak użyć tych funkcji jest bardzo dobrze napisane w manualu
seba22
Wiem,
Ale wysyłam headery, np po środku tekstu.

Nie będę przepisywać kodu, tak żeby znacznik był na samej górze.

Przecież to jest chyba sensowne ?

Z jakiej racji, mamy sobie utrudniać życie.
Po to wprowadzili technologicznie buforowanie, żeby nie trzeba było pilnować, czy gdzieś nie mamy spacji... :/
Exek
buforowanie jest wprowadzone żeby móc wykonać pewne czynności, a nie żeby propagować złe nawyki kodowania.

Z tego co widzę to mieszasz całe MVC w jednym pliku. Jeśli chcesz dobrze kodować to zainteresuj się tymi magicznymi literkami, no chyba że chcesz dalej "dziadować".
seba22
Pewne czynności, właśnie do nich, to wykożytuje.

Dobra mistrzu.


No to jak mam użyć tego ob ?

gdzie $im ( obrazek)

  1. <?php
  2.  
  3. imagejpeg($im, $miniatura);
  4.  
  5. $miniatura = ob_get_contents();
  6.  
  7. ?>

Będzie dobrze ?
Exek
tak, powinno działać
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.