Page 156 of 171

Paperclip – przycinanie obrazków – parametry

Oto jak sprawdzają się poszczególne parametry przy przycinaniu obrazków.
Obraz bazowy (512x346px):

viva_wallpaper

Bez przekształcenia (tylko zmiana rozmiaru) 150x150 powoduje zmianę rozmiaru obrazka do podanych wartości, z zachowaniem proporcji boków czyli otrzymamy obraz o rozmiarze 150x101.

493076142_mini

Najprostsze przekształcenie, czyli 150x150> sprawi, że nasz obraz będzie miał wymiary 150x101 pikseli. Jeśli plik byłby mniejszy, to nic się w nim nie zmieni. Jednak jeśli był większy, to zostanie przeskalowany do "pełniejszego" boku, z zachowaniem stosunku długości boków.

493076142_mini

Opcja 150x150! powoduje że obraz zostanie rozciągnięty do podanych wymiarów. Jeśli któryś bok jest dłuższy niż podane, to zostanie on zwężony. Jednym słowem, obraz będzie ściśnięty bądź rozciągnięty do podanego rozmiaru:

493076142_mini

Następną możliwością jest 150x150# która najpierw tak zmniejsza rozmiar obrazka, aby nie stracił proporcji, a następnie wszystko co "wystaje" poza podany rozmiar zostaje odrzucone.

493076142_mini

50% - zmniejsza nasz obraz z zachowaniem proporcji, do 50% oryginału (tutaj można jeszcze skalować bokami czyli: 20%x50% wtedy szerokość będzie mniejsza o 20% zaś wysokość o 50%):

mini_thumb_493076142

211 - automatycznie zmniejsza obraz aby miał szerokość 211px - wysokość dobierana automatycznie:

mini_thumb_493076142

x123 - zmniejszy obraz do podanej wysokości, dobierając szerokość tak aby proporcje zostały zachowane:

mini_thumb_493076142

200x200^ - dopasowuje obraz z zachowaniem proporcji - tylko wtedy jeśli jest mniejszy niż podane wymiary. Nasz jest większy więc po prostu go nie przeskaluje.

22500@ - dopasowuje obraz do podanej ilości pikseli, z zachowaniem proporcji:

mini_thumb_493076142

Walidacja rozmiaru obrazów i grafik za pomocą Paperclipa

Kilka dni temu, musiałem zwalidować rozmiar obrazka dodawanego do posta, z pomocą paperclipa. Domyślnie nie istnieje jakaś prosta metoda w stylu validates_picture_resolution, można jednak sobie z tym poradzić.

Pierwszą rzeczą jaką należy pamiętać jest to, że paperclip nie służy tylko do obsługi obrazków ale i innych rodzajów plików. Będzie to dla nas ważne w późniejszym etapie.

Ważne: nasz walidator MUSI być ostatnim walidatorem. No może przesadziłem. Nie tyle ostatnim, co ostatnim walidatorem danego elementu paperclipa.

Dla przykładu załóżmy że walidujemy rozmiar miniaturki (thumb).
W kodzie modelu dodajemy więc linijkę odpowiedzialną za uruchamianie walidacji oraz domyślne minimalne rozmiary miniaturki:

THUMB_MIN_WIDTH = 80
THUMB_MIN_HEIGHT = 50

validate :thumb_resolution

Oznaczać to będzie że jako walidator zostanie uruchomiona metoda thumb_resolution która skorzysta ze stałych i sprawdzi czy obrazek ma minimum takie wymiary.

Dlaczego wyżej napisałem, że walidator musi być jako ostatni? Ponieważ zanim sprawdzimy wymiary pliku, sprawdzić musimy czy jest to plik graficzny. Z tego względu przed naszym walidatorem, musimy uruchomić validates_attachment_content_type o którym można poczytać w dokumentacji paperclipa.

Mając ten walidator przed naszym, możemy sprawdzić czy istnieją dla miniaturki jakieś błędy. Jeśli tak to nie uruchamiamy walidacji. Kiedy plik będzie poprawny pod innymi względami, wtedy przeprowadzimy naszą walidację.

W kodzie naszego walidatora umieszczamy taki warunek:

return if self.errors.on(:thumb)

Po tym warunku, pozostaje nam jedynie sprawdzić czy plik istnieje i czy jego wymiary są poprawne. Wykonamy to wyciągając oryginalną wersję pliku i skorzystamy z Paperclip::Geometry aby ocenić wymiary.

    if self.thumb && self.thumb.queued_for_write[:original]
      dimensions = Paperclip::Geometry.from_file( self.thumb.queued_for_write[:original])
       if dimensions.width < THUMB_MIN_WIDTH || dimensions.height < THUMB_MIN_HEIGHT
         self.errors.add(:thumb, I18n.t("activerecord.errors.messages.paperclip.resolution",
           {:width => THUMB_MIN_WIDTH, :height => THUMB_MIN_HEIGHT}))
       end
    end

To wszystko :) a tak wygląda gotowa metoda:

  # Sprawdza czy rozdzielczość obrazka jest poprawna
  def thumb_resolution
    return if self.errors.on(:thumb)
    if self.thumb && self.thumb.queued_for_write[:original]
      dimensions = Paperclip::Geometry.from_file( self.thumb.queued_for_write[:original])
       if dimensions.width < THUMB_MIN_WIDTH || dimensions.height < THUMB_MIN_HEIGHT
         self.errors.add(:thumb, I18n.t("activerecord.errors.messages.paperclip.resolution",
           {:width => THUMB_MIN_WIDTH, :height => THUMB_MIN_HEIGHT}))
       end
    end
  end

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑