Webové aplikácie potrebujú jednoducho použiteľné riešenie pre upload a manipuláciu bohatého obsahu. Tento proces môže spôsobovať problémy niektorým používateľom, ktorí majú minimálne znalosti s úpravou fotografií. Orezávanie je jednou z najpoužívanejších metód pre manipuláciu s fotografiami a tento tutoriál sa bude vzťahovať na celý vývojový proces jQuery pluginu na orezávanie obrázka.
Dnes sa pozrieme na veci viac do hĺbky a rozšírime náš plugin: definujeme si ďalšie možnosti, pridáme callback, pridáme výberu možnosť presúvania a zmeny veľkosti, vytvoríme náhľad a informácie o veľkosti a napíšeme si nejaký kód po strane servera na orezanie obrázka.;p>
Otvorte svoj jquery.imagecrop.js
súbor umiestnený v jquery.imagecrop.js
a pridajte nasledujúci kód:
var defaultOptions = { allowMove : true, allowResize : true, allowSelect : true, aspectRatio : 0, displayPreview : false, displaySizeHint : false, minSelect : [0, 0], minSize : [0, 0], maxSize : [0, 0], outlineOpacity : 0.5, overlayOpacity : 0.5, previewBoundary : 90, previewFadeOnBlur : 1, previewFadeOnFocus : 0.35, selectionPosition : [0, 0], selectionWidth : 0, selectionHeight : 0, // Plugin udalost handlery onChange : function() {}, onSelect : function() {} };
Pridali sme ďalšie možnosti a dve callbacky, onChange
a onSelect
. Tieto dve môžu byť celkom užitočné v získavaní stavu pluginu.
Tu je rýchly prehľad možností, ktoré sme pridali:
0
)false
)false
)[0, 0]
)[0, 0]
)90
)1
)0.35
)V tomto kroku budeme pridávať ďalšie vrstvy. Začneme s informáciami o veľkosti.
... // Inicializuje background vrstvu informacii o velkosti a umiestni ju nad selection vrstvu var $sizeHintBackground = $('') .css({ opacity : 0.35, position : 'absolute' }) .insertAfter($selection); // Inicializuje foreground vrstvu informacii velkosti a umiestni ju nad background vrstvu var $sizeHintForeground = $('') .css({ position : 'absolute' }) .insertAfter($sizeHintBackground);
Pridáme dve oddelené vrstvy, pretože nechceme, aby popredie ovplyvňovalo priehľadnosť pozadia.
Teraz pridáme ďalších deväť vrstiev: rozširovacie úchyty
... // Inicializuje severozapadny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $nwResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje severny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $nResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje severovychodny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $neResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje zapadny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $wResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje vychodny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $eResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje juhozapadny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $swResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje juzny rozsirovaci uchyt a umiestni ho selection vrstvu var $sResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection); // Inicializuje juhovychodny rozsirovaci uchyt a umiestni ho nad selection vrstvu var $seResizeHandler = $('') .css({ opacity : 0.5, position : 'absolute' }) .insertAfter($selection);
Inicializujeme veľkosť úchytov pre každý roh a stred strany.
A konečne, náhľad.
... // Inicializuje nahlad a umiestni ho po outline vrstve var $previewHolder = $('') .css({ opacity : options.previewFadeOnBlur, overflow : 'hidden', position : 'absolute' }) .insertAfter($outline); // Inicializuje nahlad obrazka a pridá ho do nahladu var $preview = $('') .css({ position : 'absolute' }) .attr('src', $image.attr('src')) .appendTo($previewHolder);
Inicializujeme dve vrstvy:
src
ako pôvodný obrázokPoužili sme .appendTo()
metódu pre vloženie náhľadu obrázka na koniec úchytu.
Po prvé, pridáme dve nové globálne premenné.
... // Inicializuje globalne premenne var resizeHorizontally = true, resizeVertically = true, selectionExists, selectionOffset = [0, 0], selectionOrigin = [0, 0];
Tieto premenné budeme potrebovať neskôr, keď budeme aktualizovať resizeSelection()
funkciu.
V prvej časti sme sa starali len o allowSelect
možnosť. Poďme sa postarať tiež o allowMove
a allowResize
.
... if (options.allowMove) // Zviaze handler udalost na 'mousedown' udalost selection vrstvy $selection.mousedown(pickSelection); if (options.allowResize) // Zviaze handler udalost na 'mousedown' udalost rozsirovacich uchytov $('div.image-crop-resize-handler').mousedown(pickResizeHandler);
Pripojili sme mousedown
udalosť na výber a všetky rozširovacie úchyty.
Teraz musíme napísať trošku viac kódu pre aktualizovanie predtým novo-pridanej vrstvy.
... // Aktualizuje informacie o velkosti function updateSizeHint(action) { switch (action) { case 'fade-out' : // Zmiznutie informacii o velkosti $sizeHintBackground.fadeOut('slow'); $sizeHintForeground.fadeOut('slow'); break; default : var display = (selectionExists && options.displaySize) ? 'block' : 'none'; // Aktualizuje foreground vrstvu $sizeHintForeground.css({ cursor : 'default', display : display, left : options.selectionPosition[0] + 4, top : options.selectionPosition[1] + 4 }) .html(options.selectionWidth + 'x' + options.selectionHeight); // Aktualizuje background vrstvu $sizeHintBackground.css({ cursor : 'default', display : display, left : options.selectionPosition[0] + 1, top : options.selectionPosition[1] + 1 }) .width($sizeHintForeground.width() + 6) .height($sizeHintForeground.height() + 6); } };
Funkcia updateSizeHint()
obsluhuje dva prípady v závislosti od zadaného parametra.
V predchádzajúcom kroku sme veľkosť úchytov len inicializovali. Teraz ich umiestnime na správne pozície.
... // Aktualizuje rozsirovacie úchyty function updateResizeHandlers(action) { switch (action) { case 'hide-all' : $('.image-crop-resize-handler').each(function() { $(this).css({ display : 'none' }); }); break; default : var display = (selectionExists && options.allowResize) ? 'block' : 'none'; $nwResizeHandler.css({ cursor : 'nw-resize', display : display, left : options.selectionPosition[0] - Math.round($nwResizeHandler.width() / 2), top : options.selectionPosition[1] - Math.round($nwResizeHandler.height() / 2) }); $nResizeHandler.css({ cursor : 'n-resize', display : display, left : options.selectionPosition[0] + Math.round(options.selectionWidth / 2 - $neResizeHandler.width() / 2) - 1, top : options.selectionPosition[1] - Math.round($neResizeHandler.height() / 2) }); $neResizeHandler.css({ cursor : 'ne-resize', display : display, left : options.selectionPosition[0] + options.selectionWidth - Math.round($neResizeHandler.width() / 2) - 1, top : options.selectionPosition[1] - Math.round($neResizeHandler.height() / 2) }); $wResizeHandler.css({ cursor : 'w-resize', display : display, left : options.selectionPosition[0] - Math.round($neResizeHandler.width() / 2), top : options.selectionPosition[1] + Math.round(options.selectionHeight / 2 - $neResizeHandler.height() / 2) - 1 }); $eResizeHandler.css({ cursor : 'e-resize', display : display, left : options.selectionPosition[0] + options.selectionWidth - Math.round($neResizeHandler.width() / 2) - 1, top : options.selectionPosition[1] + Math.round(options.selectionHeight / 2 - $neResizeHandler.height() / 2) - 1 }); $swResizeHandler.css({ cursor : 'sw-resize', display : display, left : options.selectionPosition[0] - Math.round($swResizeHandler.width() / 2), top : options.selectionPosition[1] + options.selectionHeight - Math.round($swResizeHandler.height() / 2) - 1 }); $sResizeHandler.css({ cursor : 's-resize', display : display, left : options.selectionPosition[0] + Math.round(options.selectionWidth / 2 - $seResizeHandler.width() / 2) - 1, top : options.selectionPosition[1] + options.selectionHeight - Math.round($seResizeHandler.height() / 2) - 1 }); $seResizeHandler.css({ cursor : 'se-resize', display : display, left : options.selectionPosition[0] + options.selectionWidth - Math.round($seResizeHandler.width() / 2) - 1, top : options.selectionPosition[1] + options.selectionHeight - Math.round($seResizeHandler.height() / 2) - 1 }); } };
Podobne ako posledná funkcia, updateResizeHandlers()
testuje dva prípady: hide-all
a default
. V prvom prípade voláme .each()
metódu pre prechádzanie zodpovedajúcimi elementami.
Poďme vytvoriť updatePreview()
funkciu.
... // Aktualizuje nahlad function updatePreview(action) { switch (action) { case 'focus' : // Zobrazi nahlad vrstvu $previewHolder.stop() .animate({ opacity : options.previewFadeOnFocus }); break; case 'blur' : // Zmizne nahlad vrstva $previewHolder.stop() .animate({ opacity : options.previewFadeOnBlur }); break; case 'hide' : // Skryje nahlad vrstvu $previewHolder.css({ display : 'none' }); break; default : var display = (selectionExists && options.displayPreview) ? 'block' : 'none'; // Aktualizuje nahlad vrstvu $previewHolder.css({ display : display, left : options.selectionPosition[0], top : options.selectionPosition[1] + options.selectionHeight + 10 }); // Update the preview size if (options.selectionWidth > options.selectionHeight) { if (options.selectionWidth && options.selectionHeight) { // Aktualizuje velkost nahladu $preview.width(Math.round($image.width() * options.previewBoundary / options.selectionWidth)); $preview.height(Math.round($image.height() * $preview.width() / $image.width())); // Aktualizuje velkost vrstvy nahladu $previewHolder.width(options.previewBoundary) .height(Math.round(options.selectionHeight * $preview.height() / $image.height())); } } else { if (options.selectionWidth && options.selectionHeight) { // Aktualizuje velkost obrazkoveho nahladu $preview.height(Math.round($image.height() * options.previewBoundary / options.selectionHeight)); $preview.width(Math.round($image.width() * $preview.height() / $image.height())); // Aktualizuje velkost vrstvy nahladu $previewHolder.width(Math.round(options.selectionWidth * $preview.width() / $image.width())) .height(options.previewBoundary); } } // Aktualizuje poziciu obrazkoveho nahladu $preview.css({ left : - Math.round(options.selectionPosition[0] * $preview.width() / $image.width()), top : - Math.round(options.selectionPosition[1] * $preview.height() / $image.height()) }); } };
Kód pre prvé tri prípady by mal byť jasný. Zavoláme .animate()
metódu pre vykonanie vlastnej animácie CSS vlastností. Ďalej rozhodneme display
hodnotu a nastavíme pozíciu náhľadu.
Musíme tiež aktualizovať updateCursor()
funkciu.
... // Aktualizuje typ kurzora function updateCursor(cursorType) { $trigger.css({ cursor : cursorType }); $outline.css({ cursor : cursorType }); $selection.css({ cursor : cursorType }); $sizeHintBackground.css({ cursor : cursorType }); $sizeHintForeground.css({ cursor : cursorType }); };
A teraz posledná funkcia tohto kroku.
... // Aktualizuje rozhranie pluginu function updateInterface(sender) { switch (sender) { case 'setSelection' : updateOverlayLayer(); updateSelection(); updateResizeHandlers('hide-all'); updatePreview('hide'); break; case 'pickSelection' : updateResizeHandlers('hide-all'); break; case 'pickResizeHandler' : updateSizeHint(); updateResizeHandlers('hide-all'); break; case 'resizeSelection' : updateSelection(); updateSizeHint(); updateResizeHandlers('hide-all'); updatePreview(); updateCursor('crosshair'); break; case 'moveSelection' : updateSelection(); updateResizeHandlers('hide-all'); updatePreview(); updateCursor('move'); break; case 'releaseSelection' : updateTriggerLayer(); updateOverlayLayer(); updateSelection(); updateSizeHint('fade-out'); updateResizeHandlers(); updatePreview(); break; default : updateTriggerLayer(); updateOverlayLayer(); updateSelection(); updateResizeHandlers(); updatePreview(); } };
setSelection()
Pridáme tu len jednu vec: podpora náhľadu
... // Nastavi novy vyber function setSelection(event) { // Zabrani predvolenej akcii spustit jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); // Zviaze handler udalosti na 'mousemove' udalost $(document).mousemove(resizeSelection); // Zviaze handler udalosti na 'mouseup ' udalost $(document).mouseup(releaseSelection); // Ak je zobrazenie nahladu povolene if (options.displayPreview) { // Zviaze handler udalosti na 'mouseenter' udalost nahladu $previewHolder.mouseenter(function() { updatePreview('focus'); }); // Zviaze handler udalosti na 'mouseleave' udalost nahladu $previewHolder.mouseleave(function() { updatePreview('blur'); }); } // Zaznamena, ze existuje vyber selectionExists = true; // Resetne velkost vyberu options.selectionWidth = 0; options.selectionHeight = 0; // Ziska povodny vyber selectionOrigin = getMousePosition(event); // A nastavi jeho poziciu options.selectionPosition[0] = selectionOrigin[0]; options.selectionPosition[1] = selectionOrigin[1]; // Update only the needed elements of the plug-in interface // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania };
Testovali sme displayPreview
možnosť a použili .mouseenter()
a .mouseleave()
funkcie pre pripojenie handler udalosti, pre náhľad.
Aby bol výber posúvateľným, potrebujeme zistiť, kedy užívateľ presunie a pustí tlačidlo myši.
... // Oznaci aktualny vyber function pickSelection(event) { // Zabrani predvolenej akcii spustit jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); // Zviaze handler udalosti z 'mousemove' udalosti $(document).mousemove(moveSelection); // Zviaze handler udalosti z 'mouseup' udalosti $(document).mouseup(releaseSelection); var mousePosition = getMousePosition(event); // Ziska odsadenie vyberu relativne k pozicii mysi selectionOffset[0] = mousePosition[0] - options.selectionPosition[0]; selectionOffset[1] = mousePosition[1] - options.selectionPosition[1]; // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania updateInterface('pickSelection'); };
Tiež získame odsadenie výberu vzhľadom k pozícii myši. To budeme potrebovať neskôr, v moveSelection()
funkcii.
Užívateľ bude môcť meniť veľkosť výberu chytením a potiahnutím jedného z úchytov. A to možno vykonať dvoma spôsobmi: v oboch osiach - ak sa užívateľ rozhodne ťahať úchyt z rohu – alebo jednej osi – ak užívateľ zvoli ťahať úchyt zo stredu strany.
... // Oznaci jeden z rozisoracich uchytov function pickResizeHandler(event) { // Zabrani predvolenej akcii spustit jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); switch (event.target.id) { case 'image-crop-nw-resize-handler' : selectionOrigin[0] += options.selectionWidth; selectionOrigin[1] += options.selectionHeight; options.selectionPosition[0] = selectionOrigin[0] - options.selectionWidth; options.selectionPosition[1] = selectionOrigin[1] - options.selectionHeight; break; case 'image-crop-n-resize-handler' : selectionOrigin[1] += options.selectionHeight; options.selectionPosition[1] = selectionOrigin[1] - options.selectionHeight; resizeHorizontally = false; break; case 'image-crop-ne-resize-handler' : selectionOrigin[1] += options.selectionHeight; options.selectionPosition[1] = selectionOrigin[1] - options.selectionHeight; break; case 'image-crop-w-resize-handler' : selectionOrigin[0] += options.selectionWidth; options.selectionPosition[0] = selectionOrigin[0] - options.selectionWidth; resizeVertically = false; break; case 'image-crop-e-resize-handler' : resizeVertically = false; break; case 'image-crop-sw-resize-handler' : selectionOrigin[0] += options.selectionWidth; options.selectionPosition[0] = selectionOrigin[0] - options.selectionWidth; break; case 'image-crop-s-resize-handler' : resizeHorizontally = false; break; } // Zviaze handler udalosti z 'mousemove' udalosti $(document).mousemove(resizeSelection); // Zviaze handler udalosti z 'mouseup' udalosti $(document).mouseup(releaseSelection); // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania updateInterface('pickResizeHandler'); };
Napísali sme možnosť pre každý úchyt, pretože každý z nich potrebuje špecifické nastavenia.
resizeSelection()
Narozdiel od prvej verzie resizeSelection()
funkcie, bude možné testovať minimálnu/maximálnu veľkosť a zámok pre pomer strán výberu.
... // Zmeni velkost aktualneho vyberu function resizeSelection(event) { // Zabrani predvolenej akcii spustit jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); var mousePosition = getMousePosition(event); // Ziska velkost vyberu var height = mousePosition[1] - selectionOrigin[1], width = mousePosition[0] - selectionOrigin[0]; // Ak je velkost vyberu mensia ako minimalna velkost, ponecha minimalnu velkost if (Math.abs(width) < options.minSize[0]) width = (width >= 0) ? options.minSize[0] : - options.minSize[0]; if (Math.abs(height) < options.minSize[1]) height = (height >= 0) ? options.minSize[1] : - options.minSize[1]; // Testuje, ci velkost vyberu presahuje hranice obrazka if (selectionOrigin[0] + width < 0 || selectionOrigin[0] + width > $image.width()) width = - width; if (selectionOrigin[1] + height < 0 || selectionOrigin[1] + height > $image.height()) height = - height; if (options.maxSize[0] > options.minSize[0] && options.maxSize[1] > options.minSize[1]) { // Testuje, či velkost vyberu je vacsia ako maximalna velkost if (Math.abs(width) > options.maxSize[0]) width = (width >= 0) ? options.maxSize[0] : - options.maxSize[0]; if (Math.abs(height) > options.maxSize[1]) height = (height >= 0) ? options.maxSize[1] : - options.maxSize[1]; } // Nastavi velkost vyberu if (resizeHorizontally) options.selectionWidth = width; if (resizeVertically) options.selectionHeight = height; // Ak je specifikovany pomer strán if (options.aspectRatio) { // Vypočíta novú sirku a vysku if ((width > 0 && height > 0) || (width < 0 && height < 0)) if (resizeHorizontally) height = Math.round(width / options.aspectRatio); else width = Math.round(height * options.aspectRatio); else if (resizeHorizontally) height = - Math.round(width / options.aspectRatio); else width = - Math.round(height * options.aspectRatio); // Testuje, či nová veľkosť presahuje hranice obrazka if (selectionOrigin[0] + width > $image.width()) { width = $image.width() - selectionOrigin[0]; height = (height > 0) ? Math.round(width / options.aspectRatio) : - Math.round(width / options.aspectRatio); } if (selectionOrigin[1] + height < 0) { height = - selectionOrigin[1]; width = (width > 0) ? - Math.round(height * options.aspectRatio) : Math.round(height * options.aspectRatio); } if (selectionOrigin[1] + height > $image.height()) { height = $image.height() - selectionOrigin[1]; width = (width > 0) ? Math.round(height * options.aspectRatio) : - Math.round(height * options.aspectRatio); } // Nastavi velkost vyberu options.selectionWidth = width; options.selectionHeight = height; } if (options.selectionWidth < 0) { options.selectionWidth = Math.abs(options.selectionWidth); options.selectionPosition[0] = selectionOrigin[0] - options.selectionWidth; } else options.selectionPosition[0] = selectionOrigin[0]; if (options.selectionHeight < 0) { options.selectionHeight = Math.abs(options.selectionHeight); options.selectionPosition[1] = selectionOrigin[1] - options.selectionHeight; } else options.selectionPosition[1] = selectionOrigin[1]; // Spusti 'onChange' udalost pri zmene vyberu options.onChange(getCropData()); // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania updateInterface('resizeSelection'); };
Okrem toho sme použili onChange()
callback na konci funkcie. getCropData()
funkcia vracia aktuálny stav pluginu.
Teraz budeme písať moveSelection()
funkciu.
... // Presunie aktualny výber function moveSelection(event) { // Zabrani predvolenej akcii jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); var mousePosition = getMousePosition(event); // Nastavi poziciu vyberu na osi X relativne k hraniciam obrazka if (mousePosition[0] - selectionOffset[0] > 0) if (mousePosition[0] - selectionOffset[0] + options.selectionWidth < $image.width()) options.selectionPosition[0] = mousePosition[0] - selectionOffset[0]; else options.selectionPosition[0] = $image.width() - options.selectionWidth; else options.selectionPosition[0] = 0; // Nastavi poziciu vyberu na osi Y relativne k hraniciam obrazka if (mousePosition[1] - selectionOffset[1] > 0) if (mousePosition[1] - selectionOffset[1] + options.selectionHeight < $image.height()) options.selectionPosition[1] = mousePosition[1] - selectionOffset[1]; else options.selectionPosition[1] = $image.height() - options.selectionHeight; else options.selectionPosition[1] = 0; // Spusti 'onChange' udalost pri zmene vyberu options.onChange(getCropData()); // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania updateInterface('moveSelection'); };
Rovnako ako predtým, vyvoláme onChange()
callback na konci funkcie.
releaseSelection()
Musíme tiež upraviť releaseSelection()
funkciu.
... // Uvolni aktualny vyber function releaseSelection(event) { // Zabrani predvolenej akcii spustit jej udalost event.preventDefault(); // Zabrani zaznamenaniu udalosti event.stopPropagation(); // Odviaze handler udalosti z 'mousemove' udalosti $(document).unbind('mousemove'); // Odviaze handler udalosti z 'mouseup' udalosti $(document).unbind('mouseup'); // Aktualizuje povodny vyber selectionOrigin[0] = options.selectionPosition[0]; selectionOrigin[1] = options.selectionPosition[1]; // Resetne obmedzenie velkosti resizeHorizontally = true; resizeVertically = true; // Skontroluje, ci velkost vyberu je vacsia ako minimum a nastavi vyber podla existencie if (options.selectionWidth > options.minSelect[0] && options.selectionHeight > options.minSelect[1]) selectionExists = true; else selectionExists = false; // Spusti 'onSelect' udalost pri vytvoreni vyberu options.onSelect(getCropData()); // Ak neexistuje vyber if (!selectionExists) { // Odviaze handler udalosti z 'mouseenter' udalosti nahladu $previewHolder.unbind('mouseenter'); // Odviaze handler udalosti z 'mouseleave' udalosti nahladu $previewHolder.unbind('mouseleave'); } // Aktualizuje iba potrebne elementy rozhrania pluginu specifikovanim odosielatela aktualneho volania updateInterface('releaseSelection'); };
Resetli sme veľkostné obmedzenia a pridali podporu pre náhľad. Tiež sme použili onSelect()
callback rovnakým spôsobom, ako sme to urobili predtým s onChange()
funkciou.
Teraz sme takmer pripravení. Poďme napísať getCropData()
funkciu.
... // Vrati objekt obsahujuci informacie o stave pluginu function getCropData() { return { selectionX : options.selectionPosition[0], selectionY : options.selectionPosition[1], selectionWidth : options.selectionWidth, selectionHeight : options.selectionHeight, selectionExists : function() { return selectionExists; } }; };
Práve sme napísali poslednú funkciu tohto súboru. Uložte ho a pripravte sa na ďalší krok.
V tomto kroku zmenšíme kód pluginu pre redukovanie veľkosti a zrýchlime načítavanie. Toto riešenie spočíva v odstránení zbytočných znakov, ako sú komentáre, medzery, nové riadky a tabulátory. Dva populárne nástroje pre zmenšovanie JavaScript kódu sú YUI Compressor (ktorý tiež zmenšuje CSS) a JSMin. Použijeme prvý. Mimochodom, program je open-source, takže sa môžete pozrieť na kód pre presné pochopenie, ako funguje.
YUI Compressor je napísaný v Jave, takže nezáleží na tom, aký operačný systém používate. Jedinou podmienkou je Java >= 1.4. Stiahnite si YUI Compressor a rozbaľte ho do /resources/js/imageCrop/
priečinka. Otvorte príkazový riadok a zmeňte aktuálny pracovný adresár na túto cestu.
Ak ho používate prvýkrát, mali by ste začať tým, že vykonáte nasledujúci riadok v príkazovom riadku a prečítate si návod na použitie.
$ java -jar yuicompressor-xyzjar
Poďme zmenšiť náš kód.
$ java -jar yuicompressor-xyzjar jquery.imagecrop.js -o jquery.imagecrop.js –preserve-semi
Nezabudnite prepísať xyz
na YUI Compressor verziu, ktorú používate.
Otvorte /resources/js/imageCrop/jquery.imagecrop.css
a pridajte doň nasledujúce riadky:
... div#image-crop-size-hint-background { background-color : #000000; } span#image-crop-size-hint-foreground { color : #ffffff; font-family : 'Verdana', 'Geneva', sans-serif; font-size : 12px; text-shadow : 0 -1px 0 #000000; } div#image-crop-preview-holder { -moz-box-shadow : 0 0 5px #000000; -webkit-box-shadow : 0 0 5px #000000; border : 3px #ef2929 solid; box-shadow : 0 0 5px #000000; } img#image-crop-preview { border : none; } div.image-crop-resize-handler { background-color : #000000; border : 1px #ffffff solid; height : 7px; overflow : hidden; width : 7px; }
Pridali sme trošku štýlu informáciám o veľkosti, náhľadom a rozširovacím úchytom.
Najprv poďme načítať zmenšený (minified) plugin.
Aby bolo možné plugin testovať, musíme nejako získať veľkosť a pozíciu výberu. To je dôvod, prečo použijeme onSelect
callback; ktorý vráti objekt s aktuálnym stavom pluginu.
$(document).ready(function() { $('img#example').imageCrop({ displayPreview : true, displaySize : true, overlayOpacity : 0.25, onSelect : updateForm }); }); var selectionExists; // Aktualizuje formularove inputy function updateForm(crop) { $('input#x').val(crop.selectionX); $('input#y').val(crop.selectionY); $('input#width').val(crop.selectionWidth); $('input#height').val(crop.selectionHeight); selectionExists = crop.selectionExists(); }; // Validuje formularove data function validateForm() { if (selectionExists) return true; alert('Please make a selection first!'); return false; };
updateForm()
funkcia nastaví input hodnoty a uchová ich, ak existuje výber. Ďalej validateForm()
funkcia testuje, či existuje výber, a ak je to potrebné, zobrazí pop-up alert.
Poďme pridať formulár.
...
Pridali sme niekoľko skrytých input polí a submit tlačidlo.
V tomto príklade použijeme PHP s GD knižnicou, ale môžete použiť akýkoľvek iný server-side skriptovací jazyk, ktorý podporuje grafickú knižnicu.
Vytvorte prázdny súbor, pomenujte ho crop.php
a spustite svoj editor.
$dst_h) { $dst_h = $dst_h * $boundary / $dst_w; $dst_w = $boundary; } else { $dst_w = $dst_w * $boundary / $dst_h; $dst_h = $boundary; } // Inicializuje kvalitu vystupneho obrazka $quality = 80; // Nastavi zdrojovu cestu obrazka $src_path = 'resources/images/example.jpg'; // Vytvori novy obrazok zo zdrojovej cesty obrazka $src_image = imagecreatefromjpeg($src_path); // Vytvori vystupny obrazok ako true color obrazok specifikovanej velkosti $dst_image = imagecreatetruecolor($dst_w, $dst_h); // Skopiruje a zmeni velkost zdrojoveho obrazka s prevzorkovanim vystupneho obrazka imagecopyresampled($dst_image, $src_image, 0, 0, $_POST['x'], $_POST['y'], $dst_w, $dst_h, $_POST['width'], $_POST['height']); // Odstrani zdrojovy obrazok imagedestroy($src_image); // Posle surovu HTTP hlavicku header('Content-type: image/jpeg'); // Vysle obrazok do prehliadaca imagejpeg($dst_image, null, $quality); // Odstrani vystupny obrazok imagedestroy($dst_image); // Ukonci aktualny skript exit(); } ?>
Použili sme imagecreatefromjpeg()
metódu na vytvorenie nového obrázka zo zdrojovej adresy a imagecreatetruecolor()
pre vytvorenie výstupu ako true color
obrázka. Ďalej zavoláme imagecopyresampled()
pre skopírovanie a zmenu veľkosti časti obrázka s prevzorkovaním. Súčasný typ dokumentu nie je to, čo potrebujeme, takže zavoláme header()
funkciu pre zmenu typu na image/jpeg
. Obrázky, ktoré viac nepotrebujeme, sú zničené pomocou imagedestroy()
funkcie. Pomocou exit()
zastavíme vykonávanie aktuálneho skriptu.
Teraz máme plne prispôsobiteľný jQuery plugin na orezávanie obrázka, ktorý umožňuje užívateľovi vytvárať, posúvať, meniť veľkosť výberu a zobrazovať informácie o veľkosti a náhľade. A áno, vyzerá to rovnako aj v Internet Explorer 6! Týmto je dvojdielny tutoriál na konci, vďaka za prečítanie!
Zatiaľ žiadne komentáre
© 2009 Shaddow hosting od VIPHosting