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
This commit is contained in:
		
							parent
							
								
									531506b798
								
							
						
					
					
						commit
						fd8aff5aff
					
				
					 4 changed files with 52 additions and 27 deletions
				
			
		|  | @ -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? | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
|  | @ -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 %} | ||||||
|  |  | ||||||
|  | @ -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…
	
		Reference in a new issue
	
	 Bc. Petr Pecha
						Bc. Petr Pecha