Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie obrazków nie działa
Forum PHP.pl > Forum > PHP
mikolodz
Witam,
widzę, że problem, który opisałem wczoraj w dziale MySQL nie jest taki prosty jak się spodziewałem
Nie działało mi wyświetlanie obrazków przechowywanych w BLOBIE.
Niestety po zmianie sposobu zapisu na zapisywanie na serwerze, które notabene działa bardzo ładnie, ze zmianą rozmiaru formatu itp., nadal mam problem z wyświetlaniem obrazków.

taki skrypt u mnie nie działa, mimo, że generowanie i zapisanie na serwerze sie spisuje:
(zawartosc pliku generuj.php)
Kod
<?
        header("Content-type: image/gif");
        $obrazek = ImageCreate(80,40);
        ImageGif($obrazek);
        ImageDestroy($obrazek);    

?>

po otworzeniu tego pliku uzyskuje informacje:

Cytat
Obrazek "http://mojserwer/generuj.php" nie może zostać wyświetlony, ponieważ zawiera błędy.


To samo dzieje się kiedy robię:

showavatar.php?id=mysikun

Kod
<?
    include ('funkcje_glowne.php');
    $db = polaczZBaza();
    $id = $_GET['id'];
    $zapytanie = "select avatar from `avatars` where id='$id'";
    $wynik = $db -> query($zapytanie);
    if(($wynik -> num_rows) != 0){
        $wiersz = $wynik -> fetch_assoc();
        $nazwa = $wiersz['avatar'];
           $sciezka = "upload/".$nazwa;
           $img = imagecreatefromjpeg($sciezka);
           header("Content-type: image/jpeg");
           imagejpeg($img);
}    
    $db -> close();
?>


uzyskuję także ten sam komunikat.
chciałem wcześniej wyświetlać te obrazki w innym pliku "pokazavatar.php" poprzez:
<img scr="showavatar.php?id='.$id.'"/>";
ale oczywiście nie może to działać.

Proszę wskażcie mi mój błąd, bo straciłem na to zagadnienie blisko dobę i na prawdę nie mogę znaleźć błędu.
Czemu przy wyświetlaniu wygenerowanych obrazków wyskakuje mi błąd? Generowanie i zapis przebiegają poprawnie

np ten kod działa:

Kod
<?
     $db = polaczZBaza();
    // wczeczniej SĄ PODANE zmienne nazwa itp
    $sciezka = "upload/".$nazwa;
    
    if($sp[1] == "jpeg"){   // Sprawdzamy jakie rozszerzenie miał plik i wykonujemy dla niego nowy obrazek;
    $img = imagecreatefromjpeg($sciezka);
    }
    elseif($sp[1] == "png") {
    $img = imagecreatefrompng($sciezka);
    }
    elseif($sp[1] == "jpg") {
    $img = imagecreatefromjpeg($sciezka);
    }
    elseif($sp[1] == "gif") {
    $img = imagecreatefromgif($sciezka);
    }
    
    $a = imagesx($img);   // pobieramy szerokość i wysokość
    $b = imagesy($img);
    
    if($a > $b){   //Zmieniamy wielkość obrazka w tym wypadku szerokość musi być 150 a wysokość proporcjonalna.
    $na = 150;
    $nb = 150 * ($b / $a);
    }elseif($a < $b){
    $na = 150 * ($a / $b);
    $nb = 150;
    }else{
    $na = 150;
    $nb = 150;
    }
    
    $new_img = imagecreatetruecolor($na, $nb); // tworzymy nowy obrazek o danych wymiarach
    $cz = ImageColorAllocate($new_img,8 ,24 ,40); // tworzenie koloru. atrybuty to kolejno nowy obrazek i 3 kolory RGB - Red Green Blue

    ImageFill($new_img,1,1,$cz);  // tworzenie tła obrazka
    imagecopyresampled($new_img, $img, 0, 0, 0, 0, $na, $nb, $a, $b);

     $s = explode(".",$nazwa);
    
    
    unlink('upload/'.$nazwa); // usuwamy poprzedni plik avataru użytkownika
    @imagejpeg($new_img, "upload/".$s[0].".jpg", 100); // cyfra 9 oznacza jakosc miniaturki, osobiscie polecam wartosc 100
    $sciezka_do_pliku2 = "upload/".$s[0].".jpg";
    
    $db -> query("UPLOAD avatars SET avatar='$sciezka_do_pliku2' where id='$id'");
    $db -> close();

    }
}
?>


Po zapisie na serwerze plik ma wszystkie zadane parametry i się normalnie otwiera.
Proszę o pomoc..
bigZbig
Skoro obrazki generują się dobrze i po zapisaniu ich na serwer nie ma problemu winnym nie jest sam skrypt generujący obrazki tylko sposób wysyłania ich do przeglądarki. Upewnij się, że zwracając wynik do przeglądarki nie przesyłasz jakiś niepotrzebnych znaków(np. zanków BOM) lub nagłówków. Zalecaną praktyką jest pomijanie na końcu skryptów php znaku kończącego blok php '?>' oraz buforowanie wyniku przy pomocy funkcji ob_start.
mikolodz
Cytat(bigZbig @ 26.09.2010, 14:20:51 ) *
Skoro obrazki generują się dobrze i po zapisaniu ich na serwer nie ma problemu winnym nie jest sam skrypt generujący obrazki tylko sposób wysyłania ich do przeglądarki. Upewnij się, że zwracając wynik do przeglądarki nie przesyłasz jakiś niepotrzebnych znaków(np. zanków BOM) lub nagłówków. Zalecaną praktyką jest pomijanie na końcu skryptów php znaku kończącego blok php '?>' oraz buforowanie wyniku przy pomocy funkcji ob_start.


Dziękuję za cenne rady!! smile.gif
Faktycznie kod był w porządku.
Obszedłem problem przesyłania kodu obrazków do wyszukiwarki generując je na bieżąco funkcją.

jeśli chodzi o sam sposób w jaki to zrobiłem -
utworzyłem funkcję, która bierze obrazek użytkownika z kat. upload, nakłada go na mój firmowy obrazek z przeźroczystością i na koniec zapisuje to 'combo' w tymczasowym pliku avatar.png.
Wyświetla go przez <img src="avatar.png"/> także w tej sytuacji wilk syty i owca cała. Nie ma dostępu do samych avatarów, nikt nie wie gdzie są przechowywane, a w postaci końcowej występują tylko po wygenerowaniu na bieżąco, dzięki czemu nie tracę przestrzeni dyskowej, bo obrazek który zajmuje przed przerobieniem 18KB, po przerobieniu nieco ponad 40KB.
Nie spodziewam się takiego ruchu, żeby mógł przez to obciążyć zbyt serwer, aczkolwiek biorę pod uwagę możliwość, że mój pomysł jest nie najlepszy.

dla osób, które chcą coś takiego zrobić przesyłam kod:

Kod
<?
$db = polaczZBaza();
$zapytanie = "select avatar from avatars where id='$id'";  // pobieramy z bazy danych NAZWĘ PLIKU avatara osoby o id = $id
$wynik = $db -> query($zapytanie);
        $wiersz = $wynik -> fetch_assoc();
        $nazwa = $wiersz['avatar'];
        $sciezka = "upload/".$nazwa;
        
        
        $bcg = imagecreatefrompng('herb.png'); // moje logo
        $img = imagecreatefromjpeg($sciezka); // avatar usera
        $wysokosc = imagesy($img); // wysokosc obrazka, aby umiescic na srodku
        $szerokosc = imagesx($img);  // szerokosc obrazka
        $przesunieciey = (imagesy($bcg) - $wysokosc)/2 * -1;  //zeby był wyjustowany w pionie i poziomie
        $przesunieciex = (imagesx($bcg) - $szerokosc)/2 * -1;
  
         imagecopymerge($bcg, $img, 0, 0, $przesunieciex, $przesunieciey, imagesx($bcg), imagesy($bcg), 80); //nałożenie avatara na moje logo
        
        imagepng($bcg, 'avatar.png', 9); // zapisanie nowo wygenerowanego pliczku do avatar.png
        
        echo '<br /><br /><img src="avatar.png" alt="'.$id.'"/>';  // wyswietlenie okienka z obrazkiem
?>


oczywiście przydałyby się tam jeszcze jakieś zabezpiecznia w przypadku problemów z połączeniem itp, ale to już każdy sobie indywidualnie może napisać.

pozdrawiam, a temat wg mnie nie jest jeszcze zamknięty, bo nadal nie wiem czemu obrazki pierwszym sposobem sie nie wyświetlały.
wypróbuję metodę bigZbiga i zobaczymy czy wyskoczy jakaś wskazówka..

dziekuje za pomoc!
fander
Jak to kolego glaczego, do przeglądarki wysyłasz
header("Content-type: image/gif") czyli gif
a w skrypcie generujesz jpeg
@imagejpeg($new_img, "upload/".$s[0].".jpg", 100);,

więc coś tutaj nie jest tak, skoro powieszałeś przeglądarce że ma jeść 1 danie to sobie przygotowała łyżkę a tu nagle dostaje schabowego z frytkami, i jak to zjeść ?
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.