From fd8aff5aff52e35eea42c1100f30d00c05783f3b Mon Sep 17 00:00:00 2001 From: "Bc. Petr Pecha" Date: Tue, 13 Oct 2015 15:55:47 +0200 Subject: [PATCH] galerie | vycteni EXIFu + razeni fotek podle casu vycteni EXIFu -- otoceni fotky podle udaje z EXIFu -- prirazeni datumu podle udaje z EXIFu razeni fotek podle datumu --- galerie/TODO | 6 +-- galerie/models.py | 44 ++++++++++++++++++++ galerie/templates/galerie/GalerieNahled.html | 4 +- galerie/views.py | 25 ++--------- 4 files changed, 52 insertions(+), 27 deletions(-) diff --git a/galerie/TODO b/galerie/TODO index 940edc9d..1b497ed2 100644 --- a/galerie/TODO +++ b/galerie/TODO @@ -3,8 +3,6 @@ |======| Aktualni -* vycteni EXIFu (datum) -* razeni podle casu * třízení podgalerií * predelat URL na cistsi (odstranit probehlo) * do CSS @@ -15,5 +13,7 @@ Dlouhodobe Fylozoficke * zvolit velikosti velke a male fotky -* spravne otoceni fyzicky neotocenych fotek +* je potreba i jine razeni nez automaticky podle casu nebo staci podgalerie? + * napr. dve hry na dvou ruznych mistech ve stejny cas + * fotky od ucastniku ze hry (skupinky se pohybuji ve stejny cas, ale maji sled fotek) -- nestaci to pripadne vrazit do podgalerii? diff --git a/galerie/models.py b/galerie/models.py index abbcd4fe..02781a96 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -7,9 +7,11 @@ from django.utils import timezone from django.utils.encoding import force_unicode from PIL import Image +from PIL.ExifTags import TAGS import os from cStringIO import StringIO from django.core.files.base import ContentFile +from datetime import datetime from seminar.models import Soustredeni @@ -22,6 +24,33 @@ VIDITELNOST = ( (NIKDY, 'Nikdy'), ) +def get_exif(fn): + ret = {} + info = fn._getexif() + for tag, value in info.items(): + decoded = TAGS.get(tag, tag) + ret[decoded] = value + return ret + +def flip_horizontal(im): return im.transpose(Image.FLIP_LEFT_RIGHT) +def flip_vertical(im): return im.transpose(Image.FLIP_TOP_BOTTOM) +def rotate_180(im): return im.transpose(Image.ROTATE_180) +def rotate_90(im): return im.transpose(Image.ROTATE_90) +def rotate_270(im): return im.transpose(Image.ROTATE_270) +def transpose(im): return rotate_90(flip_horizontal(im)) +def transverse(im): return rotate_90(flip_vertical(im)) +orientation_funcs = [None, + lambda x: x, + flip_horizontal, + rotate_180, + flip_vertical, + transpose, + rotate_270, + transverse, + rotate_90 + ] + + def obrazek_filename(self, filename): return obrazek_filename_obecny(self, filename, "velky") @@ -57,6 +86,21 @@ class Obrazek(models.Model): verbose_name_plural = 'Obrázky' def save(self): original = Image.open(self.obrazek_velky) + # vycteni EXIFu + exif = get_exif(original) + if exif['Orientation']: + f = orientation_funcs[exif['Orientation']] + original_otoceny = f(original) + original_otoceny.format = original.format + original = original_otoceny + # datum podle EXIfu + if exif['DateTimeOriginal']: + datum_string = ":".join(exif['DateTimeOriginal'].split(' ')).split(":") + datum_int = [] + for retezec in datum_string: + datum_int.append(int(retezec)) + self.datum = datetime(datum_int[0], datum_int[1], datum_int[2], + datum_int[3], datum_int[4], datum_int[5]) jmeno = os.path.basename(self.obrazek_velky.file.name) if not self.obrazek_stredni: Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) diff --git a/galerie/templates/galerie/GalerieNahled.html b/galerie/templates/galerie/GalerieNahled.html index 77fe4481..135ef153 100644 --- a/galerie/templates/galerie/GalerieNahled.html +++ b/galerie/templates/galerie/GalerieNahled.html @@ -28,9 +28,9 @@ {% endif %} {# obrazky v galerii #} - {% if galerie.obrazek_set.all %} + {% if obrazky %} - {% for obrazek in galerie.obrazek_set.all %} + {% for obrazek in obrazky %} {% if forloop.counter|add:-1|divisibleby:3 %} {% endif %} diff --git a/galerie/views.py b/galerie/views.py index 3af7066e..92a61193 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -11,25 +11,6 @@ from galerie.models import Obrazek, Galerie from seminar.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm - -#def index(request, stitek=None): - #if stitek == None: - #return HttpResponseRedirect('./0/') -# - #galerie = Galerie.publikovane_galerie() - #if int(stitek) != 0: - #galerie = galerie.filter(stitek = stitek) - #if not galerie: - #raise Http404 - #galerie = galerie.order_by("-datum_zmeny") -# - #return render(request, 'Galerie/GalerieIndex.html', - #{'galerie' : galerie, - #'stitky' : Stitek.stitky_u_galerii(), - #'umisteni_stitek' : stitek, - #'umisteni_Fotogalerie' : True, - #}) - def zobrazit(galerie, request): preview = False if galerie.zobrazit >= 1: @@ -39,13 +20,14 @@ def zobrazit(galerie, request): raise Http404 return preview - def nahled(request, pk, soustredeni): """Zobrazeni nahledu vsech fotek ve skupine.""" galerie = get_object_or_404(Galerie, pk=pk) + obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum') preview = zobrazit(galerie, request) return render(request, 'galerie/GalerieNahled.html', {'galerie' : galerie, + 'obrazky' : obrazky, 'preview' : preview, }) @@ -60,7 +42,7 @@ def detail(request, pk, fotka, soustredeni): galerie = get_object_or_404(Galerie, pk=pk) preview = zobrazit(galerie, request) obrazek = get_object_or_404(Obrazek, pk=fotka) - obrazky = galerie.obrazek_set.all() + obrazky = galerie.obrazek_set.all().order_by('datum') # vytvoreni a obslouzeni formulare if request.method == 'POST': @@ -146,7 +128,6 @@ def new_galerie(request, galerie, soustredeni): o = Obrazek() o.obrazek_velky = obr o.nazev = str(obr) - o.datum = datetime.now() #TODO vycist z EXIFU o.galerie = gal o.save()