Browse Source

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
remotes/origin/Float_novinky
Bc. Petr Pecha 9 years ago
parent
commit
fd8aff5aff
  1. 6
      galerie/TODO
  2. 44
      galerie/models.py
  3. 4
      galerie/templates/galerie/GalerieNahled.html
  4. 25
      galerie/views.py

6
galerie/TODO

@ -3,8 +3,6 @@
|======| |======|
Aktualni Aktualni
* vycteni EXIFu (datum)
* razeni podle casu
* třízení podgalerií * třízení podgalerií
* predelat URL na cistsi (odstranit probehlo) * predelat URL na cistsi (odstranit probehlo)
* do CSS * do CSS
@ -15,5 +13,7 @@ Dlouhodobe
Fylozoficke Fylozoficke
* zvolit velikosti velke a male fotky * 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?

44
galerie/models.py

@ -7,9 +7,11 @@ from django.utils import timezone
from django.utils.encoding import force_unicode from django.utils.encoding import force_unicode
from PIL import Image from PIL import Image
from PIL.ExifTags import TAGS
import os import os
from cStringIO import StringIO from cStringIO import StringIO
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from datetime import datetime
from seminar.models import Soustredeni from seminar.models import Soustredeni
@ -22,6 +24,33 @@ VIDITELNOST = (
(NIKDY, 'Nikdy'), (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): def obrazek_filename(self, filename):
return obrazek_filename_obecny(self, filename, "velky") return obrazek_filename_obecny(self, filename, "velky")
@ -57,6 +86,21 @@ class Obrazek(models.Model):
verbose_name_plural = 'Obrázky' verbose_name_plural = 'Obrázky'
def save(self): def save(self):
original = Image.open(self.obrazek_velky) 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) jmeno = os.path.basename(self.obrazek_velky.file.name)
if not self.obrazek_stredni: if not self.obrazek_stredni:
Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni) Obrazek._vyrobMiniaturu(original, jmeno, 500, self.obrazek_stredni)

4
galerie/templates/galerie/GalerieNahled.html

@ -28,9 +28,9 @@
{% endif %} {% endif %}
{# obrazky v galerii #} {# obrazky v galerii #}
{% if galerie.obrazek_set.all %} {% if obrazky %}
<table class="galerie_nahled"> <table class="galerie_nahled">
{% for obrazek in galerie.obrazek_set.all %} {% for obrazek in obrazky %}
{% if forloop.counter|add:-1|divisibleby:3 %} {% if forloop.counter|add:-1|divisibleby:3 %}
<tr> <tr>
{% endif %} {% endif %}

25
galerie/views.py

@ -11,25 +11,6 @@ from galerie.models import Obrazek, Galerie
from seminar.models import Soustredeni from seminar.models import Soustredeni
from galerie.forms import KomentarForm, NewGalerieForm 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): def zobrazit(galerie, request):
preview = False preview = False
if galerie.zobrazit >= 1: if galerie.zobrazit >= 1:
@ -39,13 +20,14 @@ def zobrazit(galerie, request):
raise Http404 raise Http404
return preview return preview
def nahled(request, pk, soustredeni): def nahled(request, pk, soustredeni):
"""Zobrazeni nahledu vsech fotek ve skupine.""" """Zobrazeni nahledu vsech fotek ve skupine."""
galerie = get_object_or_404(Galerie, pk=pk) galerie = get_object_or_404(Galerie, pk=pk)
obrazky = Obrazek.objects.filter(galerie = galerie).order_by('datum')
preview = zobrazit(galerie, request) preview = zobrazit(galerie, request)
return render(request, 'galerie/GalerieNahled.html', return render(request, 'galerie/GalerieNahled.html',
{'galerie' : galerie, {'galerie' : galerie,
'obrazky' : obrazky,
'preview' : preview, 'preview' : preview,
}) })
@ -60,7 +42,7 @@ def detail(request, pk, fotka, soustredeni):
galerie = get_object_or_404(Galerie, pk=pk) galerie = get_object_or_404(Galerie, pk=pk)
preview = zobrazit(galerie, request) preview = zobrazit(galerie, request)
obrazek = get_object_or_404(Obrazek, pk=fotka) 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 # vytvoreni a obslouzeni formulare
if request.method == 'POST': if request.method == 'POST':
@ -146,7 +128,6 @@ def new_galerie(request, galerie, soustredeni):
o = Obrazek() o = Obrazek()
o.obrazek_velky = obr o.obrazek_velky = obr
o.nazev = str(obr) o.nazev = str(obr)
o.datum = datetime.now() #TODO vycist z EXIFU
o.galerie = gal o.galerie = gal
o.save() o.save()

Loading…
Cancel
Save