Strony:

Jak zrobić żeby miniatury w galerii zdjęć miały równą wielkość? np. 20x20px

euphoria-art

Avatar: euphoria-art

2009-10-28 01:17

Witam wszystkich forumowiczów!
Mam pytanie a mianowicie jak zrobić żeby miniatury w galerii zdjęć miały równą wielkość. Gdy wrzucam kwadratowe zdjęcie to jest kwadratowa miniatura, a gdy prostokątne to jest prostokątna, galeria wtedy wygląda jak by była z cegiełek nieładnie porozrzucanych. Chciałbym żeby wszystkie miniatury miały wielkość kwadrata np 20 px 20 px (prostokątne fotki dostosowywane były by automatycznie do kwadrata lub na odwrót) wtedy galeria wyglądała by bardziej schludnie.
Bardzo prosił bym o jakieś wskazówki jak mam tego dokonać, zaznaczam iż jestem początkujący w tych sprawach.
Pozdrawiam

» Quick.Cart v3.x

www.euphoria.lua.pl

Makaron

Avatar: Makaron

2009-10-29 10:31

No niestety jest to ciężkie do uzyskania, bo skrypt musiałby ucinać wgrywane fotki, a takich możliwości nie ma. Najlepszy sposób - wgrywać kwadraty.

boboo

Avatar: boboo

2010-08-25 12:24

w libraries/FotoJobs.php
w funkcji: createThumb
szukamy linijki:
$mImgDest = imagecreatetruecolor( $this->iThumbX, $this->iThumbY );
zamieniamy ją na:
$mImgDest = imagecreatetruecolor( 100, 100 );
i pod nią dodajemy:
$colorWeiss = imagecolorallocate($mImgDest, 255,255,255);
imagefilledrectangle($mImgDest,0,0,100,100, $colorWeiss);
if ($this->iThumbY > $this->iThumbX){
$iYstart = 0;
$iXstart = (int)(100 - $this->iThumbX)/2;
}
elseif ($this->iThumbX > $this->iThumbY){
$iXstart = 0;
$iYstart = (int)(100 - $this->iThumbY)/2;
}
else{
$iYstart = 0;
$iXstart = 0;
}

następnie ciut niżej znajdujemy:
if( !$sCreateFunction( $mImgDest, $mImgCreate, 0, 0, 0, 0, $this->iThumbX + 1, $this->iThumbY + 1, $iImgCreateX, $iImgCreateY ) )
i zamieniamy na:
if( !$sCreateFunction( $mImgDest, $mImgCreate, $iXstart, $iYstart, 0, 0, $this->iThumbX + 1, $this->iThumbY + 1, $iImgCreateX, $iImgCreateY ) )

Od tego momentu thumby będą się tworzyć jako kwadraty o boku 100 z białym tłem (określonym w $colorWeiss), jeśli obrazek wyjściowy nie był kwadratem. Obrazek zostaje wypośrodkowany i w zależności od formatu (portret, landscape) dostaje białe ($colorWeiss) ramki: góra/dół albo lewo/prawo.
Jak się komuś chce, może poeksperymentować z wartościami "100" i/lub włożyć tam zmienne/stałe z $config.

http://skupienie.kimla.de/?software-quickcart,106

Makaron

Avatar: Makaron

2010-08-25 14:55

O widać pospieszyłem się z odpowiedzią. Świetna robota boboo, gratuluję. Temat przy najbliższej okazji zostanie dodany również do FAQ.

Mak-Web.pl - Modyfikacje skryptów Q.Cart i Q.Cms

boboo

Avatar: boboo

2010-08-26 08:31

Dzięki, Makaron ;-)
a po wstawieniu do general.php przykładowo $config[thumb_square] = true (or false) możnaby to regulować z poziomu konfiguacji w adminie.
Oczywiście po "owinięciu" powyższego kodu "ifem" (if $thumbsquare = true)
I wrzucić w następną wersję QC i CMS.

http://skupienie.kimla.de/?software-quickcart,106

marcincook

Avatar: marcincook

2010-08-26 13:28

A czy po tej zmianie będzie można dalej kontrolować wielkość miniaturek w administracji 100 200?

boboo - super że to zrobiłeś męczę się z tym już rok

Nie znam php za bardzo i w widoku wkładałem diva np 200x200px z ukrywaniem przepełnienia a admin wkładał miniaturkę powiedzmy 250px i niby było widać :) tak jak chce ale to nie tak jak powinno być zrobione :)

Super boboo - jeszcze raz wielkie dzięki

Teraz potestuje

Chyba nie dam rady zrobić tego if ze zmienną w administracji ale będę próbował - bo to naprawdę rozwija Quicka i tej opcji już długo szukałem.

boboo

Avatar: boboo

2010-08-26 16:02

No to jedziemy z tym koksem:
1. W pliku /config/general.php
znajdź:
$config['max_dimension_of_image']
i pod tą linijką (aby sprawy grafiki trzymać w jednym miejscu) wstaw:
$config['square_thumb] = true;
2. W pliku /libraries/FotoJobs.php u góry pod linijką:
var $sCustomThumbAdd = null;
wstaw:
var $iSquareThumb = 100;
3. W tym samym pliku (FotoJobs) dużo niżej znajdź funkcję:
createCustomThumb a w niej znajdź:
else
$this->setThumbSize( $this->iCustomThumbX );
i pod tym wstaw:
$this->iSquareThumb = $this->iThumbX;
4. W następnej funkcji: createThumb (przed zmianami, które podałem 3 posty wyżej!!!) zamień linijkę:
$mImgDest = imagecreatetruecolor( $this->iThumbX, $this->iThumbY );
na taki duży blok:
if ($GLOBALS['config']['thumb_square'] == true){
$mImgDest = imagecreatetruecolor( $this->iSquareThumb, $this->iSquareThumb );
$colorWeiss = imagecolorallocate($mImgDest, 255,255,255);
imagefilledrectangle($mImgDest,0,0,$this->iSquareThumb,$this->iSquareThumb, $colorWeiss);
if ($this->iThumbY > $this->iThumbX){
$iYstart = 0;
$iXstart = (int)($this->iSquareThumb - $this->iThumbX)/2;
}
elseif ($this->iThumbX > $this->iThumbY){
$iXstart = 0;
$iYstart = (int)($this->iSquareThumb - $this->iThumbY)/2;
}
else{
$iYstart = 0;
$iXstart = 0;
}
}
else{
$mImgDest = imagecreatetruecolor( $this->iThumbX, $this->iThumbY );
$iYstart = 0;
$iXstart = 0;
}
i ciut poniżej zamień linijkę:
if( !$sCreateFunction( $mImgDest, $mImgCreate, 0, 0, 0, 0, $this->iThumbX + 1, $this->iThumbY + 1, $iImgCreateX, $iImgCreateY ) )
na:
if( !$sCreateFunction( $mImgDest, $mImgCreate, $iXstart, $iYstart, 0, 0, $this->iThumbX + 1, $this->iThumbY + 1, $iImgCreateX, $iImgCreateY ) )
5. W /lang/pl.php (i/lub innych językach) dodajemy:
$lang['square_thumb'] = "Twórz kwadratowe miniaturki";
6. W /templates/admin/settings.tpl
szukamy tabeli:
<table class="tab" id="tabOptions">
i jedziemy edytorkiem do końca tej tabeli, aż znajdziemy:
<!-- tab options -->
</table>
i nad <!-- tab options -->
wstawiamy:
<tr>
<td>$lang['square_thumb']</td>
<td>
<select name="square_thumb">
$sSquareThumb
</select>
</td>
</tr>
7. W pliku /actions_admin/settings.php
nad linijką:
$sFormTabs = $oTpl->tbHtml( 'settings.tpl', 'CONFIG_TABS' );
wstawiamy:
$sSquareThumb = throwTrueFalseSelect( $config['square_thumb'] );

Od tego momentu decydujemy w panelu admina, czy nowowgrywane zdjęcia produktów mają mieć kwadratowe miniaturki (działa i na 100, i na 200 - czyli wielkości ustawione w general.php).
Jednak nie działa to wstecz!!!
Czyli tylko miniaturki wgrane z ustawioną opcją: TAK (panel admina, konfiguracja, opcje) będą kwadratowe i takie pozostaną.

I to by było na tyle w temacie równych miniaturek

http://skupienie.kimla.de/?software-quickcart,106

marcincook

Avatar: marcincook

2010-08-26 17:45

boboo -

1.)
A czy ty byś umiał zrobić żeby po wczytaniu fotek z kanałem Alpha 0
Czyli PNG lub GIF z przezroczystym tłem
Po stworzeniu miniatury dalej miał by przezroczystość
Np.:
Wkładam obrazek Ikonę na tło teksturowane

2.)
I czy umiałbyś zrobić taką modyfikację że klient w konfiguracji wczytuje logo w pliku png z przezroczystością powiedzmy 200x120px

Następnie to logo wkładane jest jako logo na froncie

to samo logo jest skalowane do powiedzmy 25px i nakładane na fotki przy produkowaniu miniaturek i kopiowaniu zdjęć na serwer

Albo w konfiguracji
trzy pola uploadu:
Wczytaj logo na stronę
wczytaj logo jako znak wodny na fotkę dużą
wczytaj logo jako znak wodny na miniaturki


Ja sobie z tymi żeczami raczej nie poradzę, a OpenSolution chyba nie za bardzo ma czas na takie żeczy.

boboo

Avatar: boboo

2010-08-30 09:06

Uuups,
w punkcie 4. w linijce:
if ($GLOBALS['config']['thumb_square'] == true){
wkradł się "czeski błąd"
zamiast: 'thumb_square'
MA BYĆ:
'square_thumb'
!!!

http://skupienie.kimla.de/?software-quickcart,106

marcincook

Avatar: marcincook

2010-09-06 16:07

Próbowałem Próbowałem

I nie wychodziło coś

Więc znowu zrobiłem swoimi sposobami :(

http://personaldesign.pl/

Kwadraty jako link z backgroud-image

marcincook

Avatar: marcincook

2010-09-06 16:12

Zrobiłem chyba z 10 rozmiarów miniatur zamiast dwóch trzeba te tła dopasowywać

Jak jest długa lista to wolno się te tła wczytują (logiczne) bo najpierw buduje się html

A obrazki zostawiłem na display none

Cała kombinacja żeby zadziałało i zadziałało - a to co powyżej podałeś boboo to by było moje długie spełnienie marzeń -

gdyby zadziałało z przycinaniem foty do kwadratu

boboo

Avatar: boboo

2010-09-06 19:10

Pokręcę w wolnej chwili z przycinaniem.

http://skupienie.kimla.de/?software-quickcart,106

euphoria-art

Avatar: euphoria-art

2010-09-06 21:05

marcincook, podejrzałem Twoją stronkę, podobają mi się białe cienie przysłaniające header - http://personaldesign.pl/templates/img/opacity75_2x200.png, oraz podświetlenie loga, jeśli możesz podeślij mi kod i obrazki do podmianki, chciałbym taką samą wielkość hadera wraz z tymi cieniami bez żadnych marginesów, był bym bardzo wdzięczny za pomoc, euphoria_art@onet.eu, dzięki i pozdrawiam

http://www.obrazygaleria.pl

marcincook

Avatar: marcincook

2010-09-06 22:13

euphoria-art

Kod to chyba sobie potrafisz skopiować a i adres obrazka też już podałeś

Może go nie zauważyłeś bo ma 2piksele szerokości i pozycje top w background image

Jeśli chodzi o cień (hmm raczej światło) pod logo to są dwa obrazki w rollOver pod a

Photoshop receptę Ci podam to sobie zrobisz jaki chcesz kolor
1. Nowy obrazek przezroczyste tło
2. Rysujesz kółko - takie duże jak chcesz - np 250piks dokument = kółko 100piks max
3. Filtr > rozmycie guasowskie - duży radius (poeksperymentuj)
4. Zapisz dla internetu PNG 1bit na kanał Alpha

W Darmowym gimpie też na pewno można tak butelkowo rozmyć obiekt, ale nie mam doświadczenia w gimpie (7lat na photoshopie + Adobe Certyfikat Ekspert, więc mi trudno się w gimpie odnaleść :) ale zapewne sobie poradzisz


Ja jak zaczełem przygody z kodowaniem css html js to też chciałem wszystko dostać gotowe do użycia

Ale teraz DZIĘKUJĘ ludziom z różnych forum że też mi podawali recepty na wszystko co chciałem a nie gotowe rozwiązania.

Więc pokombinuj a ja Ci mogę pomagać na forum czy mailu czy skype / FORUM jest o tyle lepsze że z tej porady może ktoś jeszcze skorzystać a nie tylko jedna osoba

Up to YOU

marcincook

Avatar: marcincook

2010-09-06 22:21

PS.

Lepiej założyć nowy temat "Porady graficzne - przezroczystość"
Niż zaśmiecać ten wątek

bo przyznam szczerze że liczę że temat miniatrek kwadratowych się rozwinie do takiego stopnia że można będzie ten skrypt od OpenSolution rozwinąć
Bo jest banalnie prosty w obsłudze dla użytkowników Adminów i zasługuje na Dobry rozwój o Pare zabawek żeby OpenSol... zebrało więcej uzytkowników i w końcu w darmowej wersji zrobili też SEO Frendly bo to jest ogromny minus tego narzędzia

Sam kupiłem kilkanaście licencji płatnych tylko dlatego że nie ma ?http

A miło by było żeby OpenSolution mogło zarabiać żeby to rozwijać - ale nie będzie zarabiać z taką liczbą użytkowników (porównaj wordpresa czy joomle)

Ale chyba już bardzo nie na temat piszę

Jestem skłonny pomagać graficznie + CSS + HTML + AS3 Flash
Fajnie jak by ktoś pomagał mi w php - bo ta kolejność generowanych treści i taka "obiektowość" jest na razie dla mnie nie do ogarnięcia na tyle żebym sobie sam radził a co do tego pomagać

boboo

Avatar: boboo

2010-09-07 19:24

Marcin,
zacznij grać w sudoku ;-)
szybciej wtedy ogarniesz QC
:-)
Ale, proszę daj mi parę wskazówek: "spełnienie marzeń - przycinanie fotek do kwadratu".
Wnioskuję, że chodzi o "główne fotki".
Do jakiego rozmiaru?
Centrycznie?

http://skupienie.kimla.de/?software-quickcart,106

euphoria-art

Avatar: euphoria-art

2010-09-09 10:11

bobo na tej stronie jest galeria przycięta http://www.viking-jeans.com.pl/?pl_oferta,3
jest też fajne rozwiązanie po najechaniu na fotkę przysłania go w pół przezroczyste tło
http://www.viking-jeans.com.pl/templates/img/photo_bg_hover.png, jest to quick.cms może da się jakoś podpatrzeć w plikach, co i jak zmienić. Wszystkie fotki mogą być przycięte do prostokąta tak jak na tej podanej wyżej stronie.

marcincook

Avatar: marcincook

2010-09-09 11:45

boboo

Może to Ci ułatwi zrozumienie o co mnie chodzi http://inherit.pl/ProporcjeMiniatur.jpg

Fakt Sudoku nigdy nie rozumiałem

Wiem że często za dużo wymagam od narzędzi które generują w efekcie htmla ale jestem grafikiem, a programuję tylko dlatego że muszę, coś tam wiem o flashu i AS3 i w takiej obiektowości potrafię się odnaleść a php męczę już jakiś czas i dochodzę do wniosku że chyba zaczne uczyć się php a nie php w QuickCms bo trochę nie mogę się połapać


We flashu robi się to tak że maskuję obrazek kwadratem...

a zresztą wklejam ci cały pakiet AS3 (Flash) który robi ma klasy (w php to chyba raczej funkcje)
które prubuje wykonać w tej bibliotece Quickowej od pół roku czy lepiej.
Jak sobie włożysz ten kod do czegoś co Ci składnie pokoloruje to zrozumiesz chyba o co mi chodzi

Weź sobie w notepad++ włącz język Flash AS i poczytaj poniższy kod


Wszystko jest dość dobrze skomentowane
więc to jest działanie którego ni jak nie mogę uzyskać w QCms i QCatr

KLASA ---- GALERIA & DZIAŁANIE NA OBRAZKACH
package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.text.*;
import flash.filters.ColorMatrixFilter;
import fl.motion.AdjustColor;
import flash.errors.IOError;
import flash.utils.*;
import flash.ui.*;

public class galeria extends MovieClip
{
//własność okreslająca nazwę galerii domyślnie jest to galeria.xml
private var galeriaNazwa:String = "galeria.xml";
//zmienne przechowujące dane wczytane z pliku XML
private var listaObrazow:XMLList;
private var liczbaObrazow:Number;
//loader pliku XML z opisem zdjęć do galerii
private var xmlLoader:URLLoader = new URLLoader();
//ewentualne wymuszenie jakości wyświetlania
//stage.quality=StageQuality.BEST;
//parametry okna miniatur
private var kolumnyGaleria:uint = 3;
private var wierszeGaleria:uint = 5;
private var krokGaleria:Number = kolumnyGaleria * wierszeGaleria;
private var marginesLewo:Number = 10;
private var marginesGora:Number = 20;
//odstępy miniatur w okienku
private var odstepMiniatury_x:Number = 10;
private var odstepMiniatury_y:Number = 10;
//początkowa wyświetlana strona
private var stronaGaleria:Number = 1;
//rozmiar ramki dla dużego zdjęcia i dla miniatury
private var zdjecieRamka:Number = 4;
private var loaderRamka:Number = 3;
//zmienna ustawiona na true oznacza, że zdjęcie ma wypełnić pole wyświetlania, false oznacza dopasowanie
private var wypelnijZdjecie:Boolean = false;
//zmienna ustawiona na true oznacza, że zdjęcie ma być wygładzone, false oznacza brak wygładzania
private var wygladzZdjecie:Boolean = true;
//podobnie jak wyżej tylko dla miniatur
private var wypelnijMini:Boolean = true;
private var wygladzMini:Boolean = true;
//numer aktualnie wyświetlanego zdjęcia
private var numerZdjecie:int = -1;
//pozycja Y przycisków - przyda się do ich tymczasowego usuwania
private var wsteczY:Number = 590.60;
private var dalejY:Number = 590.60;

public function galeria():void
{
//ustawiamy okno galerii na stały rozmiar
stage.scaleMode = StageScaleMode.NO_SCALE;

//wywolujemy funkcję wczytywania pliku XML z opisem galerii
//cała reszta funkcjonalności galerii jest inicjowane w tej funkcji
zaladujXML();

//ustawiamy zawartość klipu panelZdjęcie na 1 klatkę
panelZdjecie.gotoAndStop(1);
}

private function zaladujXML():void
{
//rozpoczynamy ładowanie pliku xML z opisem galerii
xmlLoader.load(new URLRequest(galeriaNazwa));
//określamy akcję na wypadek zdarzenia błędu wczytywania pliku XML
xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, bladXML);
//wywołujemy przetwarzanie zawartości pliku XML po jego wczytaniu
xmlLoader.addEventListener(Event.COMPLETE, przetworzXML);

//funkcja wyświetlająca informację w wypadku błędu
function bladXML(e:IOErrorEvent):void
{
galeriaTytul.text = "UWAGA Nie można załadować galerii";
e.target.removeEventListener(IOErrorEvent.IO_ERROR, bladXML);
e.target.close();
}
}
//funkcja przetworzXML wczytuje listę zdjęć wraz z opisem, wyświetla tytuł galerii w polu galeriaTytul
//określa liczbę wczytanych fotografii, oraz wywoła funkcję która wyświetli pierwszą grupę miniatur
private function przetworzXML(e:Event):void
{
var xmlPlik:XML = new XML(e.target.data);

galeriaTytul.text = xmlPlik. @ NAZWA;
listaObrazow = xmlPlik.IMAGE;
liczbaObrazow = listaObrazow.length();

inicjujPanelMiniatury(stronaGaleria);

//usuwamy detektor zdarzen po przetworzeniu pliku XML i kasujemy wczytaną zawartość z pamięci
xmlLoader.removeEventListener(Event.COMPLETE, przetworzXML);
xmlLoader = null;
}

//funkcja inicjujPanelMiniatury oblicza zakres indeksów zdjęć, które mają być wyświetlone na stronie o numerze podanym jako argument
//wejściowy, następnie inicjuje działanie przycisków przewijania listy miniatur, na koniec wywołuje funkcję, która
//wczyta miniatury
private function inicjujPanelMiniatury(strona:Number):void
{
var odNumer:Number = krokGaleria * (strona - 1);
var doNumer:Number = odNumer + krokGaleria;

//warunek, aby na ostatniej stronie wyświetlić tylko tyle obrazów ile pozostało
if (doNumer > liczbaObrazow)
{
doNumer = liczbaObrazow;
}

//właczamy lub wyłączamy przyciski
if (strona == 1)
{
wstecz.y += wsteczY + 200;
dalej.y=dalejY;
dalej.addEventListener(MouseEvent.CLICK, doPrzodu);

} else if (strona==Math.ceil(liczbaObrazow/krokGaleria))
{
wstecz.y = wsteczY;
dalej.y+=dalejY+200;
wstecz.addEventListener(MouseEvent.CLICK,doTylu);
} else
{
wstecz.y=wsteczY;
dalej.y=dalejY;
//określamy akcje dla zdarzenia kliknięcia myszą na przyciski dalej i wtecz
//czyli włączamy ich działanie
dalej.addEventListener(MouseEvent.CLICK, doPrzodu);
wstecz.addEventListener(MouseEvent.CLICK,doTylu);
}

//wywolanie funkcji, która wypełni okno miniatur zdjęciami
//panelZdjecie.gotoAndStop(3);
wypelnijPanelMiniatury(odNumer,doNumer);
}

//funkcja doPrzodu określa działanie dla przewijania listy miniatur do przodu
private function doPrzodu(e:MouseEvent):void
{
//funkcje usuwające starą zawartość okien miniatur i powiększenia
czyscPanelMiniatury();

//wyłączamy działanie przycisków
dalej.removeEventListener(MouseEvent.CLICK, doPrzodu);
wstecz.removeEventListener(MouseEvent.CLICK,doTylu);

//wywołanie kolejnej strony miniatur, stronaGaleria wzrasta przed wywołaniem
inicjujPanelMiniatury(++stronaGaleria);
}

//funkcja doTylu określa działanie dla przewijania listy miniatur wstecz
private function doTylu(e:MouseEvent):void
{
//funkcje usuwające starą zawartość okien miniatur
czyscPanelMiniatury();

dalej.removeEventListener(MouseEvent.CLICK, doPrzodu);
wstecz.removeEventListener(MouseEvent.CLICK,doTylu);

//wywolanie poprzedniej strony miniatur, stronaGaleria maleje przed wywołaniem
inicjujPanelMiniatury(--stronaGaleria);
}

//funkcja czyscPanelMiniatury usuwa zawartośc panelMiniatury, najpierw kasowana jest zawartośc poszczególnych
//loaderów miniatur, jeśli takie istnieją, a na koniec usuwane z listy wyświetlania są wszystkie ramki miniatur
private function czyscPanelMiniatury():Boolean
{
// tutaj zmienna i w pętli zmniejsza się tylko do 1 gdyż 0 oznacza zawartość panelMiniatury, którą wygenerowaliśmy
for (var i:int = panelMiniatury.numChildren-1; i>0; i--)
{
var dziecko=panelMiniatury.getChildAt(i);
for (var j:int = dziecko.numChildren-1; j>=0; j--)
{
var loader=dziecko.getChildAt(j);
//sprawdzamy czy zmienna loader przechowuje obiekt typu Loader, służy temu operator is
if (loader is Loader)
{
loader.unload();
loader=null;
}
}
//usuwamy obiekt tylko gdy istnieje
if (dziecko!=null)
{
panelMiniatury.removeChild(dziecko);
}
}
return true;
}

//funkcja wypelnijPanelMiniatury zapełnia okno panelMiniatury miniaturami zdjęć
private function wypelnijPanelMiniatury(startNumer:uint,koniecNumer:uint):void
{
var kolumna:Number=0;
var wiersz:Number=0;

//pętla dla wszystkich zdjęć
for (var i:Number = startNumer; i < koniecNumer; i++)
{
//tworzymy okno miniatury, w którym umieścimy miniaturę
var oknoMiniatury:OknoMiniatury = new OknoMiniatury();
//nadajemy nazwę okienku miniatury, taką jak numer zmiennej i
oknoMiniatury.name=String(i);

//przechodzimy do drugiej klatki klipu oknoMiniatury, która zawiera klip
//animacji wyświetlany aż miniatura nie zostanie załadowana i wyświetlona
oknoMiniatury.gotoAndStop(2);

//określamy położenie danego okna miniatury i dodajemy go do panelu panelMiniatury
oknoMiniatury.x=marginesLewo+(oknoMiniatury.width+odstepMiniatury_x)*kolumna;
oknoMiniatury.y=marginesGora+(oknoMiniatury.height+odstepMiniatury_y)*wiersz;
panelMiniatury.addChild(oknoMiniatury);

//pobieramy adres miniatury z danych XML
var adresMiniatury=listaObrazow[i].@MINI;

//tworzymy loader, który załaduje zdjęcie
var miniLoader = new Loader();
//kopiujemy nazwę okna miniatury do nazwy loadera miniatury
miniLoader.name=oknoMiniatury.name;
miniLoader.x=miniLoader.y=loaderRamka;
//określamy własność filters loadera, czyli efekt kolorystyczny
miniLoader.filters=usunKolor(true);
//miniLoader.alpha=0.75;

//okreslamy rozmiar maski która zasłoni część zdjęcia nie mieszczącą się w okienku miniatury
//nastepnie dodajemy ją do oknoMiniatury
var maska:Sprite=utworzMaske(oknoMiniatury.width,oknoMiniatury.height,loaderRamka,loaderRamka);
//aktywujemy maskę zdjęcia
miniLoader.mask=maska;
oknoMiniatury.addChild(maska);

//rozpoczynamy ładowanie pliku miniatury
miniLoader.load(new URLRequest(adresMiniatury));

//wywolujemy detektor zdarzenia błedu ładowania miniatury
//tutaj funkcja wywoływana w przypadku zdarzenia przyjmuje argument
//wymaga to odpowiedniej konstrukcji tej funkcji - patrz jej definicja
miniLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, bladMini(oknoMiniatury));

//wywołujemy funkcję która po załadowaniu miniatury do pamięci przeskaluje ją tak
//aby mieściła się na szerokość lub wysokość w oknie miniatury, oraz ją wyświetli
miniLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, wczytajMini);

//dodajemy interaktywność do miniatury dla efektu najezdu myszą
//oraz dla kliknięcia - w tym przypadku załadowane zostanie duże zdjęcie
miniLoader.addEventListener(MouseEvent.MOUSE_OVER, myszNad);
miniLoader.addEventListener(MouseEvent.MOUSE_OUT, myszPoza);
miniLoader.addEventListener(MouseEvent.CLICK, zaladujDuze);

//wywolujemy efekt kliknięcia na pierwsze zdjęcie na stronie, aby je załadować
//do panelZdjecie, dzieki temu po otwarciu galerii lub nowej strony miniatur w panelZdjecie
//będzie załadowana już fotografia
if (i==startNumer)
{
miniLoader.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
//zmiana liczników kolumn i wiersza
if (kolumna+1<kolumnyGaleria)
{
kolumna++;
} else
{
kolumna=0;
wiersz++;
}
//funkcja reagująca na błąd wczytywania, zwraca na funkcję której postać akceptuje addEventListener,
//czyli funkcję która ma tylko jeden argument typu Event oraz jest typu void
//zwracana funkcja jest wyświetla 3 klatki klipu oknoMiniatury, która zawiera stosowny tekst
function bladMini(okno:MovieClip):Function
{
return function(e:IOErrorEvent):void {
okno.gotoAndStop(3);
e.target.removeEventListener(IOErrorEvent.IO_ERROR,bladMini);
}
}

//funkcja wczytajMini wczytuje miniaturę i wyświetla z efektem przejścia
function wczytajMini(e:Event):void
{
//zmienne wskazują kolejno na obiekt loadera miniatury, oraz na obiekt
//okna miniatury
var mojaMini:Loader=Loader(e.target.loader);
var mojaRamka=panelMiniatury.getChildByName(mojaMini.name);
mojaRamka.zaladowano=true;

//tworzymy obiekt efektu, który będzie dodany do miniatury
var mojEfekt:Efekt = new Efekt();

//usuwamy detektor zdarzeń
mojaMini.contentLoaderInfo.removeEventListener(Event.COMPLETE, wczytajMini);

//skalujemy miniaturę
skalujZdjecie(mojaRamka,mojaMini,2*loaderRamka, 2*loaderRamka, wypelnijMini, wygladzMini);
//centrujemy miniaturę
centrujZdjecie(mojaRamka, mojaMini);

//pozycjonujemy okno z efektem
mojEfekt.x=loaderRamka;
mojEfekt.y=loaderRamka;
mojEfekt.width=mojaRamka.width-2*loaderRamka;
mojEfekt.height=mojaRamka.height-2*loaderRamka;

// przechodzimy do 1 klatki dla okna miniatury, która jest pusta
mojaRamka.gotoAndStop(1);

//dodajemy miniaturę i efekt do obiektu okna miniatury
mojaRamka.addChildAt(mojaMini,mojaRamka.numChildren);
mojaRamka.addChildAt(mojEfekt,mojaRamka.numChildren);

//uruchamiamy odtwarzanie efektu
mojEfekt.addEventListener(Event.ENTER_FRAME,usunEfekt);
}
}
}
//funkcja tworzy prostokątną maskę o rozmiarze rozmiarX, rozmiarY z uwzględnieniem marginesu ramki
//podanego jako zmienne ramkaX, ramkaY
private function utworzMaske(rozmiarX:Number, rozmiarY:Number,ramkaX:Number, ramkaY:Number):Sprite
{
//zmniejszamy rozmiar maski o rozmiar ramki
var maskaRozmiar_x=rozmiarX-2*ramkaX;
var maskaRozmiar_y=rozmiarY-2*ramkaY;

var maska:Sprite = new Sprite();

maska.graphics.beginFill(0xFF0000);
maska.graphics.drawRect(0, 0, maskaRozmiar_x, maskaRozmiar_y);
maska.x=ramkaX;
maska.y=ramkaY;

return maska;
}
//funkcja wywołuje wczytywanie duzych zdjęć, na poczatku czyści starą zawartość obiektu
//panelZdjecie, a następnie wyświetla prosty preloader ukryty w 2 klatce klipu panelZdjecie
//po załadowaniu zdjęcia wywoływana jest funkcja wyświetlająca to zdjęcie wyswietlDuze
//a także dodawany jest opis zdjęcia i jego numer na liście do pól opisZdjecie i opisZdjecie2
private function zaladujDuze(e:MouseEvent):void
{
panelZdjecie.gotoAndStop(2);
//usuwamy starą zawartość
czyscZdjecie();

//usuwamy detektor zdarzeń i zostawiamy kolor dla miniatury, na którą kliknęliśmy
e.target.addEventListener(MouseEvent.CLICK, zaladujDuze);

//tworzymy loader dla dużego zdjęcia
var duzeLoader:Loader = new Loader();
//ustalamy numer zdjęcia
duzeLoader.name=e.target.name;

//z danych XML pobieramy adres dużego obrazka
var duzyAdres=listaObrazow[duzeLoader.name].@DUZE;

//uruchamiamy nasłuchiwanie zdarzenia błędu wczytywania dużego zdjecia
duzeLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, bladDuze);
//uruchamiamy nasłuchiwanie zdarzenia zainicjowania dużego zdjecia
duzeLoader.contentLoaderInfo.addEventListener(Event.INIT, wyswietlDuze);

//wywolujemy ladowanie dużego pliku
duzeLoader.load(new URLRequest(duzyAdres));
//wyswietlamy opis zdjęcia plus numer na liście i rozmiar w kilobajtach jako wartość text
numerZdjecie =int(duzeLoader.name)+1;
opisZdjecie.text=listaObrazow[duzeLoader.name].OPIS;
opisZdjecie2.text=numerZdjecie+"/"+liczbaObrazow;
}
//obsługa błędu ładowania dużego zdjęcia, wyświetla komunikat, który
//ukryty jest w 3 klatce klipu panelZdjęcie
private function bladDuze(err:IOErrorEvent):void
{
//włączamy klatkę z komunikatem błędu
panelZdjecie.gotoAndStop(3);
opisZdjecie.text="";
//usuwamy detektory zdarzeń
err.target.removeEventListener(IOErrorEvent.IO_ERROR, bladDuze);
err.target.removeEventListener(Event.COMPLETE, wyswietlDuze);
}

//funkcja załadowane zdjęcie skaluje i wyświetla z efektem przejścia klasy Efekt
//efekt jest generowany dynamicznie jako klip filmowy, który nałozony zostaje na
//obiekt zdjęcia, klip efektu zdefiniowany jest w edytorze Flash
private function wyswietlDuze(e:Event):void
{
var mojeZdjecie:Loader=Loader(e.target.loader);
//tworzymy obiekt z efektem
var mojEfekt:Efekt = new Efekt();

skalujZdjecie(panelZdjecie,mojeZdjecie, 2*zdjecieRamka, 2*zdjecieRamka, wypelnijZdjecie, wygladzZdjecie);
centrujZdjecie(panelZdjecie, mojeZdjecie);

mojeZdjecie.contentLoaderInfo.removeEventListener(Event.COMPLETE, wyswietlDuze);

//określamy położenie klipu z efektem tak aby nakladał sie na zdjęcie
mojEfekt.x=mojeZdjecie.x-1;
mojEfekt.y=mojeZdjecie.y-1;
mojEfekt.width=mojeZdjecie.width+1;
mojEfekt.height=mojeZdjecie.height+1;

//okreslamy rozmiar maski która zasłoni część zdjęcia nie mieszczącą się w oknie panelZdjecie
//istotne gdy zdjęcia wypełniają panelMiniatury, nastepnie dodajemy ją do oknoMiniatury
//dla każdego maskowanego obiektu tworzymy oddzielną maskę
var maskaDuze:Sprite=utworzMaske(panelZdjecie.width,panelZdjecie.height,zdjecieRamka,zdjecieRamka);
var maskaDuze2:Sprite=utworzMaske(panelZdjecie.width,panelZdjecie.height,zdjecieRamka,zdjecieRamka);
//włączamy maskowanie zdjęcia mojeZdjecie oraz efektu mojEfekt

mojeZdjecie.mask=maskaDuze;
mojEfekt.mask=maskaDuze2;

panelZdjecie.gotoAndStop(1);

//dodajemy wszystkie niezbędne elementy do panelZdjecie - koniecznie w takiej kolejności
//,panelZdjecie.numChildren);
panelZdjecie.addChild(maskaDuze);
panelZdjecie.addChild(maskaDuze2);
panelZdjecie.addChild(mojeZdjecie);
panelZdjecie.addChild(mojEfekt);

//uruchamiamy odtwarzanie efektu
mojEfekt.addEventListener(Event.ENTER_FRAME,usunEfekt);
}
//funkcja usuwa obiekt efektu po jego jednorazowym odtworzeniu
private function usunEfekt(e:Event):void
{
if (e.target.currentFrame>=e.target.totalFrames)
{
e.target.stop();
//próbujemy usunąć element, gdy nie istnieje, ignorujemy błąd, wykorzystujemy konstrukcję
// try catch, blok try wykonujemy i gdy nastąpi błąd wykonujemy polecenia bloku catch
//pozwala to ignorować błędy i ich komunikaty
try
{
e.target.parent.removeChild(e.target.parent.getChildByName(e.target.name));
}
catch (err:Error)
{
//ignorujemy błąd
}
e.target.removeEventListener(Event.ENTER_FRAME,usunEfekt);
}
}
//funkcja centruje wyświetlanie zdjecia w kontenerze, ustawiając jego współrzędne
//względem lewego górnego rogu
private function centrujZdjecie(kontener:DisplayObject, zdjecie:Loader):void
{
zdjecie.x=kontener.width/2-zdjecie.width/2;
zdjecie.y=kontener.height/2-zdjecie.height/2;
}
//funkcja skaluje zdjęcia do rozmiaru kontenera, jako argumenty wykorzystuje wymiary zdjęcia i kontenera w którym będzie umieszczone
//dodatkowo uwzględnia margines ramki wokół zdjęcia
//zmienna logiczna wypełnij okresla czy zdjęcie ma wypełniać calość ramki czy być dopasowane
//zmienna logiczna wygladz określa czy zdjęcie ma być wygladzone po przeskalowaniu
private function skalujZdjecie(kontener:DisplayObject,zdjecie:Loader,ramkaX:Number, ramkaY:Number, wypelnij:Boolean, wygladz:Boolean):void
{
var skala:Number;
var skalaX:Number =(kontener.width - ramkaX)/zdjecie.width;
var skalaY:Number =(kontener.height - ramkaY)/zdjecie.height;
if (wypelnij)
{
//operator trzyargumentowy arg1 : arg2 ? arg3 zwraca wynik arg2, gdy arg1 jest prawdą, w przeciwnym razie zwraca arg3
skala = (skalaX > skalaY) ? skalaX : skalaY;
} else
{
skala = (skalaX > skalaY) ? skalaY : skalaX;
}

if (skala<1)
{
zdjecie.scaleX=skala;
zdjecie.scaleY=skala;
}
//jeśli parametr wygladz jest true wygładzamy zdjęcie po zmniejszeniu (aby nie było przeostrzone)
//konieczne rzutowanie na typ bitmapa gdyż tylko wtedy można skorzystać z własności smoothing
if (wygladz)
{
Bitmap(zdjecie.content).smoothing=true;
}
}

//funkcja określa działanie dla umieszczenia myszy nad obiektem
//tu zmienia kolor na kolorowy
//inna opcja, parametr alpha zmienia przezroczystość
private function myszNad(e:MouseEvent):void
{
e.target.filters=usunKolor(false);
//e.target.alpha=1;
}
//funkcja określa działanie dla umieszczenia myszy nad obiektem
//tu zmienia kolor na czrnobiały
//inna opcja, parametr alpha zmienia przezroczystość
private function myszPoza(e:MouseEvent):void
{
e.target.filters=usunKolor(true);
//e.target.alpha=0.75;
}

//funkcja usuwa z pamięci i z listy wyswietlania duże zdjecie
private function czyscZdjecie():void
{
//konieczne przejście do pierwszej klatki, jesli nie jesteśmy w niej
//wywołanie funkcji skończy się błędem
panelZdjecie.gotoAndStop(1);

var i:int=panelZdjecie.numChildren;
while (i-- > 1)
{
var loader=panelZdjecie.getChildAt(i);
if (loader is Loader)
{
loader.unload();
loader=null;
} else
{
panelZdjecie.removeChildAt(i-1);
}
}
}

//funkcja definiuje filtr transformacji kolorów na czrnobiały lub kolorowy
private function usunKolor(czarnobialy:Boolean):Array
{
var kolor:AdjustColor = new AdjustColor();
kolor.brightness=0;
kolor.contrast=0;
kolor.hue=0;
if (czarnobialy)
{
kolor.saturation=-100;
} else
{
kolor.saturation=0;
}

var macierz:Array=kolor.CalculateFinalFlatArray();
var macierzKolor:ColorMatrixFilter=new ColorMatrixFilter(macierz);
var filtrCZB:Array=[macierzKolor];

return filtrCZB;
}

}
}

Pozdrawiam
m.

marcincook

Avatar: marcincook

2010-09-09 11:54

euphoria-art

http://css-tricks.com/examples/GarageDoorMenu/

Przydał by się Temat LINKI :)

boboo

Avatar: boboo

2010-09-16 19:15

Czyli ma to być nie wycinek (np. 100x100) z dużego obrazka, tylko wycinek z thumba (miniaturki), docięty do 100x100
?
Znaczy robimy thumba - tym razem jego krótszy bok ma 100 - a to dłuższe symetrycznie docinamy do stu.
Dobrze zrozumiałem?

Strony:
Do góry
o nas | kontakt