Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PROBLEM Z GALERIA
Forum PHP.pl > Forum > Gotowe rozwiązania
stoprocent
MAM WIELKI PROBLEM Z GALERIA ! SZUKALEM SKRYPTU KTORY ROZWIAZAL BY MOJ KLOPOT ALE NAWET NA HOTSCRIPTS.COM Z POSROD 200 ROZNYCH NIE ZNLAZLEM ODPOWIEDNIEGO ! POTRZEBUJE GALERIE ZROBiONA TAK ze kazde thumbnail ma taka sama wysokosc a nie szerokosc jak jest we wszystkich skryptach ! a pozatym thumbnail powinny byc proporcjonalnie pomniejszone a co sie tym wiaze to to ze npa jezeli zdjecie bylo bardzo dlugie to w jednym rzedzie zmiesci sie tylko jedno ! w wiekszosci skryptow trzeba podac ile w rzedzie ma byc i ile kolumn ! a ja sie pytam czy jest mozliwe zeby nie podawac ile fotek w rzedzie tylko jaka dlugosc moze byc w jednym rzedzie ! przyklad mam 3 male fotki ktore zajmuja w sumie 600 px ! i mieszcza sie w jednym rzedze ! nastepnie chce dodac 1 zdjecie o dlugosci 600 px ! po dodaniu tego zdjecia ono bedzie samo w 1 rzedzie a podspodem 3 zdjecia tez w rzedzie !! MOZE WIELE OSOB TEGO NIE ZROZUMIE ! ALE JEZELI ZNAJDZIE SIE KTOS KTO BEDZIE MI POTRAFIL POMOC TO BEDE WDZIECZNY !!! POZDRAWIAM

[post zmoderowany - Seth]
Cod
To jest do zrobienia.

Najpierw przy pomocy php tworzysz małe obrazeczki (tego akurat nie umiem, bo jeszcze nigdy nie zabierałem się za obróbkę grafiki w php, ale jest tu wiele ludzi, którzy się na tym znają, jest też manual). Później do tablicy przypisujesz wartości szerokości kolejnych minifotek (z tego co wiem, jest funkcja, zwracająca taką informację o obrazku, trzeba poszukać w manualu). I teraz, jeśli stronę robisz np. pod 800x600, to skrypt wstawia jeden obrazek i sprawdza, czy 780 (20 pixeli zajmuje suwak z boku strony) - szerokość pierwszego - 20 (jakiś odstęp pomiędzy obrazkami musi być) jest większa od zera. Jeśli tak, to wstawia drugi obok pierwszego. Jeśli nie, wrzuca drugi do następnej linijki, itd. Myślę, że da się to zrobić przy pomocy pętli while().
spenalzo
Skrypt do robienia miniaturek:
[php:1:c9cdd6c0e7]<?php
# Wyłączenie limitu czasu oraz ustawienie do pracy w tle
set_time_limit(0);
ignore_user_abort(TRUE);

# Wymiary docelowego obrazka
$x=400;
$y=300;

# Tworzenie nowego obrazka o wymiarach $x i $y
$im_doc=@imagecreate($x,$y);

#Pobieranie obrazka źródłowego
$im_src=@imagecreatefromjpeg("obrazek.jpg");

#Pobieranie wysokości i szerokości obrazka źródłowego
$srcx=@imagesx($im_src);
$srcy=@imagesy($im_src);

# Ustalanie koloru czarnego
$kol[czarny]=@imagecolorallocate($im_doc,0,0,0);

#Wypełnianie obrazka docelowego czarnym kolorem (nie wiem czy potrzebne?)
@imagefill($im_doc,0,0,$kol[czarny]);

# Kopiowanie zmniejszonego do wymiarów $x i $y obrazka źródłowego
@imagecopyresized($im_doc,$im_src,0,0,0,0,$x,$y,$srcx,$srcy);

#Zapisywanie obrazka
imagepng($im_doc,"miniaturka.png");

/* Poniżej generowanie obrazka powiadamiajacego o zapisaniu miniaturki, można skasować */
$im=@imagecreate(183,13);
$kol[czarny]=imagecolorallocate($im,0,0,0);
$kol[bialy]=imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$kol[bialy]);
imagestring($im,3,5,5,"Miniaturka: OK",$kol[czarny]);
Header("Content-type: image/png");
imagepng($im);
?>[/php:1:c9cdd6c0e7]
kicaj
wszystko jes GIT

ale:
jezeli ustawilem maxymalnie 300x300px
(mniejszy obrazek kopiuje sie bez zadnych zmian)
to rysunek o wymiarach 700x400 zmniejsza mi sie do 300x300 i wyglada jak nie wiem co...
Ja chcem zeby on sie zmniejszyl do jakiegos tam stopnia pomniejszenia a nie pomniejszenia z rozciagnieciem jednej ze stron :/

Nie wiem czy jasno sie wyrazilem tongue.gif
Teodor
Jezeli chcesz miec pomniejszone proporcjonalnie to zrob tak:
[php:1:4ba23d3eaa]<?php
# Wyłączenie limitu czasu oraz ustawienie do pracy w tle
set_time_limit(0);
ignore_user_abort(TRUE);

# procent wielkosci
$resize_by = 30;

#Pobieranie obrazka źródłowego
$im_src=@imagecreatefromjpeg("obrazek.jpg");

#Pobieranie wysokości i szerokości obrazka źródłowego
$srcx=@imagesx($im_src);
$srcy=@imagesy($im_src);

# Wymiary docelowego obrazka <--- tu mala zmiana
$x=$srcx*$resize_by/100;
$y=$srcy*$resize_by/100;

# Tworzenie nowego obrazka o wymiarach $x i $y <--- tu mala zmiana
$im_doc=@ImageCreateTrueColor($x,$y);

# Ustalanie koloru czarnego
$kol[czarny]=@imagecolorallocate($im_doc,0,0,0);

#Wypełnianie obrazka docelowego czarnym kolorem (nie wiem czy potrzebne?)
@imagefill($im_doc,0,0,$kol[czarny]);

# Kopiowanie zmniejszonego do wymiarów $x i $y obrazka źródłowego
@imagecopyresized($im_doc,$im_src,0,0,0,0,$x,$y,$srcx,$srcy);

#Zapisywanie obrazka
imagepng($im_doc,"miniaturka.png");

/* Poniżej generowanie obrazka powiadamiajacego o zapisaniu miniaturki, można skasować */
$im=@imagecreate(183,13);
$kol[czarny]=imagecolorallocate($im,0,0,0);
$kol[bialy]=imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$kol[bialy]);
imagestring($im,3,5,5,"Miniaturka: OK",$kol[czarny]);
Header("Content-type: image/png");
imagepng($im);
?>[/php:1:4ba23d3eaa]

w przykladzie zmienilem imagecreate() na ImageCreateTrueColor() - daje lepsza jakosc.

Pozdrawiam
kicaj
[php:1:4134b937cc]
$resize_by = 30;

#fotka: 400x400
$x = 400*$resize_by/100; //wynik 120

#fotka: 1400x900
$x = 700*$resize_by/100; //wynik 420
[/php:1:4134b937cc]

Chodzi o to ze jezeli wysokosc lub szerokosc podanego rysunku bedzie przekraczala ustalony wczesniej wymiar, to ma pomniejszyc go proporcjonalnie, do maxymalnych ustalonych wczesniej wymiarów!

Ustalony wczesniej maxymalne rozmiary!
Kod
$x = 300;

$y = 300;


Mam obrazek o wymiarach x=120 i y=80 - pozostawia go bez zmian, ale Jesli mam obrazek o wymiarach x= 420 i y=40 to pomniejsza jego x, ale tyle samo razy pomniejsza jego y i/lub odwrotnie!
kicaj
Meczylem sie, meczylem, az wkoncu wymyslilem![php:1:b4b919a5e4]
$im_src=@imagecreatefromjpeg("obrazek.jpg");
$srcx=@imagesx($im_src);
$srcy=@imagesy($im_src);

$x=150;
$y=150;

if($srcy > $srcx) { //Sprawdza czy wysokosc jest wieksza

$ile = $srcy/$y; //Dzieli wysokosc przez ustalony maxymalny wymiar

//Dzieli szerokosc i wysokosc przez wyliczona wczesniej liczbe "pomniejszania"
$szerokosc = $srcx/$ile;
$wysokosc = $srcy/$ile;

} else {

$ile = $srcx/$x;
$szerokosc = $srcx/$ile;
$wysokosc = $srcy/$ile;

}

$im_doc=@imagecreate($szerokosc,$wysokosc);
@imagecopyresized($im_doc,$im_src,0,0,0,0,$szerokosc,$wysokosc,$srcx,$srcy);
imagejpeg($im_doc,"$obrazek_name");
[/php:1:b4b919a5e4]

Aha to dotyczy plikow JPEG smile.gif
Teodor
wlasnie mialem to napisac smile.gif
moje rozni sie tylko tym ze mniejszych nie powieksza:
[php:1:451accc918]<?php
$max_x = 400;
$max_y = 300;

if ($srcx > $max_x && $srcx > $srcy) {
$x=$max_x;
$y=$srcy*($max_x/$srcx);
}
else if ($srcy > $max_y && $srcy > $srcx) {
$y=$max_y;
$x=$srcx*($max_y/$srcy);
}
else {
$y = $srcy;
$x = $srcx;
}

?>[/php:1:451accc918]

Pozdrawiam
kicaj
hehe moj tez nie, tylko zapomnialem na poczatku wkleic jeszcze troche kodu[php:1:dbe4a6f875]<?php
if(($srcx > $x) || ($srcy > $y)) {
?>[/php:1:dbe4a6f875]
i na koncu[php:1:dbe4a6f875]<?php
} else {
//kopiuj orginalny obrazek!
}
?>[/php:1:dbe4a6f875]

smile.gif)
kicaj
...mam problem, gdy chcem dodac nowy plik o takiej samej nazwie jak jest juz, to powinien mi go zastapic, ale ta sie nie robi? dlaczego?
squid
Cytat
Skrypt do robienia miniaturek:
[php:1:ea8ab108e4]<?php
# Kopiowanie zmniejszonego do wymiarów $x i $y obrazka źródłowego
@imagecopyresized($im_doc,$im_src,0,0,0,0,$x,$y,$srcx,$srcy);
?>[/php:1:ea8ab108e4]

Ludziska nauczcie sie ze sie nigdy nie uzywa f-cji imagecopyresized(), tylko imagecopyresampled(), a jak ktos nie wie dlaczego to niech sprawdzi i porowna efekt dzialania tych dwooch f-cji.
Raz na zawsze imagecopyresized() - to f-cja archaiczna angrysmiley.gif angrysmiley.gif angrysmiley.gif angrysmiley.gif angrysmiley.gif angrysmiley.gif angrysmiley.gif
kicaj
...ale mi to wogole nie pomoglo...

Przy robieniu miniaturki nie zamienia mi poprzedniego obrazu!!!
zuku
Mysle ze to powinno cie zadowolic. Przerobilem z dwoch skryptow z forum w jeden.
Najwazniejsze zeby poprawnie dodac sciezke do katalogu z kontem gdzie dokladnie ma zapisywac pliki i pamietaj o uprawnieniach (chmod 666 [nazwa_katalogu]).
Skrypt sprawdzalem, dziala... Kopiuje plik na serwer a pozniej robi miniaturke i dodaje na poczatek m_ do nazwy pliku (miniaturki).
Moze ktos ma pomysl jak zabezpieczyc sie przed plikami typu txt, exe itp. poprostu zeby ich nie kopiowal.
Aha i tez wazne skrypt dziala poprawnie w pelni z plikami *.jpg. Mozna przerobic/dorobic inne.

Powodzenia
zuku

index.php
[php:1:2a8310058a]
<?php

/******************************************************************************/
/* ZDJECIE - kopiowanie, miniaturka, podglad */
/******************************************************************************/
function Zdjecie () {

$uploaddir = "/sciezka/dostepu/do/katalogu/gdzie/ma/zapisywac/pliki/";
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
print "Kopiowanie zakończone <b>sukcesem</b>. Informacja o pliku:n";
print_r($_FILES);
} else {
print "Kopiowanie zakończone <b>porażka</b>! Informacja o pliku:n";
print_r($_FILES);
}

if (!$max_width) $max_width = 160; // max szerokosc miniaturki
if (!$max_height) $max_height = 120; // max wysokosc miniaturki

$size = GetImageSize($uploaddir . $_FILES['userfile']['name']);
$width = $size[0];
$height = $size[1];

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;

if ( ($width <= $max_width) && ($height <= $max_height) ) {
$tn_width = $width;
$tn_height = $height;
}
else if (($x_ratio * $height) < $max_height) {
$tn_height = ceil($x_ratio * $height);
$tn_width = $max_width;
}
else {
$tn_width = ceil($y_ratio * $width);
$tn_height = $max_height;
}

$src = ImageCreateFromJpeg($uploaddir . $_FILES['userfile']['name']);
$dst = ImageCreateTrueColor($tn_width,$tn_height);

ImageCopyResampled ($dst, $src, 0, 0, 0, 0, $tn_width, $tn_height, $width, $height);

$dopisz = "m_"; //do miniaturki dopisze m_nazwapliku.jpg
ImageJpeg ($dst, $uploaddir . $dopisz . $_FILES['userfile']['name']);
}//

//START/////////////////////////////////////////////////////////////////////////

if ($_GET['zuk'] == 1) {
Zdjecie ();
echo "
<a href=".$_FILES['userfile']['name']." target=_blank>
<img src=m_".$_FILES['userfile']['name']." alt="" border=0></a>
";
} else {
echo "
<form enctype="multipart/form-data" action="index.php?zuk=1" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="3000000">
Dodaj obrazek: <input name="userfile" type="file">
<input type="submit" value="OK">
</form>
";
}

?>[/php:1:2a8310058a]

Zapomnialbym...
Najlepiej zmienna $uploaddir podac tam gdzie bedzie w/w plik i ten folder niech bedzie (666) lub odpowienio zmodyfikuj linijke 55 (href=...) i 56 (src=...). Chyba wiadomo o co chodzi.
boya
ten skrypt co napisał zuku

po odpaleniu wypisuje mi cos takiego

Kod
Kopiowanie zakończone sukcesem.  Informacja o pliku:

Array

(

    [userfile] => Array

        (

            [name] => logo.jpg

            [type] => image/pjpeg

            [tmp_name] => /tmp/phpqIttpR

            [error] => 0

            [size] => 8789

        )



)


pliku w katalogu nie ma questionmark.gif
zuku
Byc moze dodajesz plik graficzny z nazwa: "Nazwa pliku.jpg" ? Uzywasz spacji... ?
pozmu
[quote="zuku"]Moze ktos ma pomysl jak zabezpieczyc sie przed plikami typu txt, exe itp. poprostu zeby ich nie kopiowal.
Aha i tez wazne skrypt dziala poprawnie w pelni z plikami *.jpg. Mozna przerobic/dorobic inne.
[/php]

Sprawdzanie rozszerzenia uploadowanego pliku:
[php:1:7e2e745166]<?php
//dozwolone rozszerzenia
$allowed_ext = array("jpg","jpeg","png");
$extok = 0;
$extension = pathinfo(basename($_FILES[$key]['name']));
//pętelka
foreach($allowed_ext as $wartosc)
{
if($extension["extension"] == $wartosc)
$extok = 1;
}
if(!$extok)
die("Niedozwolne rozszerzenie");
?>[/php:1:7e2e745166]

Uwaga: można też dodać sprawdzanie po mime-type (info o typie jest w tablicy $_FILES[$key]['type']), ale tylko dodatkowo, a nie zamiast - to nie jest prawdziwe mime-type, a tylko to, co wysyła przeglądarka, więc user może nasz oszukać.
pozmu
Cytat
ten skrypt co napisał zuku
pliku w katalogu nie ma questionmark.gif


za print_r daj:
[php:1:40410706ae]<?php
echo $uploaddir . $_FILES['userfile']['name'];
?>[/php:1:40410706ae]

I na 90% dowiesz się, co jest przyczyną problemu
boya
jak wyzej napisalem plik ktory chce wsadzic nazywa sie logo.jpg[/b]
djpeterek
skrypt dziala elegancko ale jak dozucic do tego zeby jakosc miniaturek byla np 80%
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.