Generowanie miniatur w php – rozważania teoretyczne

Zazwyczaj piszę o praktycznych sposobach rozwiązywania określonych problemów. Jednakże tym razem skupię się nad bardziej teoretycznymi zagadnieniami. Generatory miniatur mają to do siebie, że część tworząca obrazek stanowi jedynie niewielki wycinek całości. O czym warto pamiętać i co warto wprowadzić do generatora ?

Format graficzny

Na stronach przeważnie używany jest jpg. Jest niewielki i ma dość dobrą jakość. Niestety nie zawsze daje się zadowolić wszystkich. Jpg nie sprawdzi się, gdy użytkownicy będą chcieli mieć ekstra-ostre ikony (np. przy nazwach poszczególnych sekcji serwisu). Nie da się nim także zrobić obrazków jako tło do akordeona (jQuery accordion i pokrewne). Dlatego też wybór jest dość prosty: jpg + png (jeżeli mamy zamiar reanimować IE6, to można do tego dorzucić jeszcze gif). W tym momencie w skrypcie generującym pojawiają się warunki powiązane z wyjściowym obrazkiem i z obrazkiem na serwerze (jeśli robimy png, to dodatkowo trzeba upewnić się, że kopiujemy także kanał alpha).

Cache

Generowanie miniatur jest dość czasochłonne dla serwera. Oczywiście można wygenerować miniatury w momencie wgrywania obrazków na serwer, ale w razie zmiany zdania co do wymiarów będzie nas czekało ponowne wgrywanie albo pisanie skryptu, który co zadany czas wygeneruje kilka nowych miniatur. Z tego też powodu warto jest rozważyć inne podejście. Skrypt generujący miniatury może zapisywać je do odpowiedniego katalogu. W razie takiego samego wywołania (wymiary, format, itp.) wystarczy od razu odesłać treść wcześniej utworzonego pliku.

Przy stosowaniu cache pojawia się jednak dodatkowy problem. W razie zmiany parametrów miniatury (o ile definicje miniatur trzymane są w bazie) konieczne będzie wyrzucenie wszystkich wcześniej wygenerowanych obrazków.

Definicje miniatur

Użytkownicy lubią mieć pod ręką możliwość zmiany parametrów. Dlatego też prawdopodobnie trzeba będzie zrobić w panelu administracyjnym odpowiednią podstronę pozwalającą dodawać i zmieniać ustawienia miniatur. Tutaj pojawią się takie parametry jak:

  • – nazwa definicji (dla administratora serwisu/ludzi zajmujących się treścią)
  • – format wyjściowy
  • – zachowanie wielkości obrazka źródłowego
  • – zrobienie miniatury o wymuszonych wymiarach
  • – kolor tła do wymuszonej miniatury
  • – zrobienie miniatury z wymiarami dopasowanymi do min( wysokość, szerokość )
  • – znak wodny

Liczba parametrów będzie rosła w miarę pojawiania się kolejnych pomysłów co do tego jak mają być generowane obrazki na stronie. Powyżej przedstawiłem listę najczęściej występujących ustawień.

Przy stosowaniu definicji miniatur zapisanych w bazie do generatora trzeba będzie przekazać identyfikator takiej definicji. Przy takim podejściu trzeba będzie do listy obrazków dla edytora (tinymce, być może fckeditor) dorzucić odpowiednie linijki, co przy wielu zdefiniowanych miniaturach spowoduje spore zamieszanie. Z tego też powodu warto rozważyć dodanie jeszcze jednej opcji „wstaw miniaturę do listy edytora www”.

Dodatkowe nagłówki

To, że miniatury siedzą na serwerze gotowe do pobrania nie zawsze wystarczy. Czasami przydaje się także wymusić na przeglądarce zachowanie obrazków na dłuższy czas, powiedzmy na miesiąc. W razie zmiany definicji miniatury konieczne staje się wymuszenie przeładowania obrazka siedzącego na dysku użytkownika. Ciężko będzie pogodzić te rzeczy ze sobą. Tu niewiele mogę doradzić. Być może zabawa z E-Tagiem i Last-modified da odpowiedni rezultat. Przeważnie stosuję dodatkową zmienną w adresie pliku, np. &v=1.01 (lub ?v=1.01). To powoduje, że przeglądarki pobierają nową treść zastępując starą. W przypadku obrazków będzie się to wiązało z odpaleniem dodatkowego filemtime dla każdej generowanej miniatury (już poza samym skryptem tworzącym pomniejszone obrazki).

Parametry w adresie

Generator będzie pobierać z adresu ($_GET) szereg parametrów. Zapewne będzie to id obrazka (o ile dane o obrazkach trzymane są w tabeli z kluczem INT AUTOINCREMENT) oraz id definicji miniatury. Dodatkowo mogą pojawić się inne zmienne mające wpływ na działanie generatora. Jedną z takich zmiennych może być rozszerzenie wyjściowego obrazka. Należy rozważyć możliwość częściowego obejścia definicji i wprowadzenia parametrów przez administratora/obsługę. Z jednej strony da to większą elastyczność, ale z drugiej strony wprowadzimy do generatora zamieszanie. Skrypt będzie musiał określić, który format wyjściowy ma uwzględnić (ten z obrazka źródłowego, ten z definicji w bazie czy ten z adresu). Poza tym należałoby rozważyć jakie zmienne mogą się pojawić i w jaki sposób generator ma zapamiętywać miniatury z wymuszonymi ustawieniami.

Panel administracyjny obrazków

W samym panelu administracyjnym (w sekcji wyświetlającej wgrane obrazki) uwzględnić trzeba będzie tylko format graficzny obrazka oraz id (o ile dane o obrazku są zapisane w bazie). Do tego wystarczy zrobić szachownicę (np. szaro-białą) i wstawić ją pod przezroczyste obrazki (png, gif). Sama wielkość miniatur powinna być dobrana tak, żeby pasowała do layoutu. Tu można zastosować miniatury generowane podczas wgrywania obrazków na serwer. Dodatkowo warto wstawić przy obrazkach możliwość podejrzenia ich z zastosowaniem określonej definicji miniatury.

Konstrukcja skryptu

Skrypt tworzący miniatury przyjmie następującą postać:

  1. przyjmowanie parametrów
  2. sprawdzenie i ew. usunięcie starej miniatury
  3. pobranie definicji z bazy
  4. ostateczne określenie obrazka na podstawie definicji i parametrów z punktu 1
  5. przekazanie parametrów do funkcji generującej miniaturę
  6. cała masa if else + funkcje zapisujące wygenerowane obrazki do wskazanej lokalizacji
  7. odesłanie nagłówków i treści pliku

O czym warto pamiętać

Włączenie cache podczas szczytu (po dłuższym czasie, a nie od razu) może zdenerwować administrację serwera (większe obciążenie dysku związane z zapisem plików). Brak cache może zdenerwować administrację serwera (duże obciążenie procesora podczas generowania w kółko tych samych miniatur).PHP może generować grafikę 3d, nawet jeśli jest to Gouraud czy Phong.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*