def get_size(self, filename=None): from PIL import Image if filename: image = Image.open(filename) else: image = Image.open(self.file) return '%ix%i' % (image.size[0], image.size[1])
def render(self, context): try: # If size is not an int, then it's a Variable, so try to resolve it. if not isinstance(self.size, int): self.size = int(self.size.resolve(context)) self.user = self.get_user(context) except Exception as e: print(e) return '' # just die... if self.size > _settings.DEFAULT_AVATAR_WIDTH: return '' # unacceptable profile = self.get_profile() if not profile: return '' # Avatar's heaven, where all the avatars go. avatars_root = path.join(_settings.AVATARS_DIR, slugify(self.user.username)) file_root, file_name, defaulting = self.get_file(profile) if defaulting: file_root = _settings.AVATARS_DIR if self.size_equals(): return self.as_url(path.join(file_root, file_name)) file_path = path.join(file_root, file_name) # I don't return the default because I have to resize it. if not defaulting: if path.exists(file_path) and self.size_equals(file_path): return self.as_url(file_path) else: if not profile.avatar: file_root = _settings.AVATARS_DIR file_path = path.join(file_root, _settings.DEFAULT_AVATAR) # Oops, I din't find it, let's try to generate it. if path.exists(file_path): orig_file = Image(file_path) dest_root = path.join(avatars_root, str(self.size)) try: makedirs(dest_root) except Exception as e: print(e) # Save the new path for later... dest_path = path.join(dest_root, file_name) else: # Did my best... return '' # fail silently orig_file.scale(self.size) if orig_file.write(dest_path): return self.as_url(dest_path) else: print('=== ERROR ===') return '' # damn! Close but no cigar...
def get_filename(self, context): file_path = self.image_name.resolve(context) if path.exists(file_path): self.image = Image(file_path) self.thumb_width, self.thumb_height = self.image.size().dimensions() i = file_path.rfind('/') return (file_path[:i], file_path[i+1:]) # TODO: # TODO: Implementar un wallpaper por defecto que se va a mostrar en # TODO: lugar de los wallpapers que falten mientras alguien lo arregla. raise MissingImageError(file_path)
def get_resolution(self, filename=None): from PIL import Image if filename: image = Image.open(filename) else: image = Image.open(self.file) relation = float(image.size[0])/float(image.size[1]) if relation == float(2)/float(3): return '2:3' #iPhone's resolution elif relation == float(5)/float(4): return '5:4' elif relation == float(4)/float(3): return '4:3' elif relation == float(3)/float(2): return '3:2' elif relation == float(8)/float(5): return '8:5' elif relation == float(5)/float(3): return '5:3' elif relation == float(16)/float(9): return '16:9' elif relation == float(17)/float(9): return '17:9'
def get_file(self, profile=None): default = False file_name = None # username = slugify(profile.user.username) file_root = _settings.AVATARS_DIR # La diferencia entre self.default y default es que el primero indica # que tengo que devolver el avatar por defecto, mientras que el segundo # marca si estoy devolviendo el avatar por defecto o no. if self.default: default = True else: if profile is not None: # Este try es por si en profile.avatar existe una relación a un # avatar que no existe en la tabla de avatars. try: if profile.avatar: file_name = profile.avatar.name except: profile.avatar = None profile.save() default = True if not file_name or not path.exists(path.join(file_root, file_name)): file_name = _settings.DEFAULT_AVATAR default = True avatar_file = path.join(file_root, file_name) self.orig = Image(avatar_file) self.orig_width = self.orig.size().width() self.orig_height = self.orig.size().height() if not self.sizes_ok(with_original=True): if default: file_name = file_name[file_name.rfind('/')+1:] file_name = '%(width)i-%(name)s' % \ {'width': self.width, 'name': file_name} new_avatar = path.join(file_root, file_name) else: new_avatar = '' # Hack alert! self.resize(avatar_file, new_avatar) return (file_name, default)
if defaulting: file_root = _settings.AVATARS_DIR if self.size_equals(): return self.as_url(path.join(file_root, file_name)) file_path = path.join(file_root, file_name) # I don't return the default because I have to resize it. if not defaulting: if path.exists(file_path) and self.size_equals(file_path): return self.as_url(file_path) else: if not profile.avatar: file_root = _settings.AVATARS_DIR file_path = path.join(file_root, _settings.DEFAULT_AVATAR) # Oops, I din't find it, let's try to generate it. if path.exists(file_path): orig_file = Image(file_path) dest_root = path.join(avatars_root, str(self.size)) try: makedirs(dest_root) except Exception, e: print e # Save the new path for later... dest_path = path.join(dest_root, file_name) else: # Did my best... return '' # fail silently orig_file.scale(self.size) if orig_file.write(dest_path): return self.as_url(dest_path) else: print '=== ERROR ==='
def size_equals(self, file=None): if not file: return self.size == _settings.DEFAULT_AVATAR_WIDTH else: return self.size == Image(file).size().width()
def get_for_resolution(self, resolution): from os import path, makedirs from math import ceil dest_width, dest_height = [int(side) for side in resolution.split('x')] # /path/to/directory file_root = self.file[:self.file.rfind('/')] # filename.ext file_name = self.file[self.file.rfind('/') + 1:] # /path/to/directory/1280x800 dest_root = path.join(file_root, resolution) # /path/to/directory/1280x800/filename.ext dest_path = path.join(dest_root, file_name) if not path.exists(dest_path): if not path.exists(dest_root): makedirs(dest_root) file_orig = Image(self.file) if self.width != dest_width or self.height != dest_height: rule_width = round( (float(dest_width)*float(100))/float(self.width)) rule_height = round( (float(dest_height)*float(100))/float(self.height)) temp_width, temp_height = dest_width, dest_height if rule_height > rule_width: # TODO: # TODO: Testear caso en que ancho sea flotante. temp_width = (rule_height*self.width)/100 file_orig.scale(temp_width, dest_height) else: temp_height = (rule_width*self.height)/100 file_orig.scale(dest_width) if rule_width != rule_height: x_offset = str((temp_width-dest_width)/2) y_offset = str((temp_height-dest_height)/2) file_orig.crop(str(resolution)+'+'+x_offset+'+'+y_offset) wmark_file = settings.WATERMARK_FILE wmark = Image(wmark_file) if wmark.size().width() > dest_width and dest_width > 200: wmark_file = wmark_file[:wmark_file.rfind('.')] + '-small' + \ wmark_file[wmark_file.rfind('.'):] # FIXME: # FIXME: La marca de agua no se ve en sistemas que implementan # FIXME: barras de herramientas inferiores. Hay que colocarla unos # FIXME: 50px mas arriba. # file_orig.watermark(wmark_file) file_orig.comment(settings.COMMENT) file_orig.write(dest_path) return dest_path
class ResizedThumbnailNode(Node): def __init__(self, width, height, user, default): try: self.width = int(width) except: self.width = Variable(width) try: self.height = int(height) except: self.height = Variable(height) if not user: self.username = '******' else: self.username = user self.default = default def get_user(self, context): return Variable(self.username).resolve(context) def sizes_ok(self, with_original=False): if with_original: orig_width = self.orig_width orig_height = self.orig_height else: orig_width, orig_height = _settings.DEFAULT_AVATAR_SIZE orig_height = _settings.DEFAULT_AVATAR_SIZE[1] return self.width >= orig_width and self.height >= orig_height def both_sides_equals(self, fname): return self.orig_width == self.orig_height def resize(self, orig='', dest=''): if not path.exists(orig): # print orig, 'does not exists' return None if path.exists(dest): # print dest, 'already exists' return True if not dest: dest = orig self.orig.scale(self.width, self.height) if self.orig.write(dest): # print 'resizing done, returning...' return self.as_url(dest) else: print ' *** ERROR *** ' return None # damn! Close but no cigar... def get_file(self, profile=None): default = False file_name = None # username = slugify(profile.user.username) file_root = _settings.AVATARS_DIR # La diferencia entre self.default y default es que el primero indica # que tengo que devolver el avatar por defecto, mientras que el segundo # marca si estoy devolviendo el avatar por defecto o no. if self.default: default = True else: if profile is not None: # Este try es por si en profile.avatar existe una relación a un # avatar que no existe en la tabla de avatars. try: if profile.avatar: file_name = profile.avatar.name except: profile.avatar = None profile.save() default = True if not file_name or not path.exists(path.join(file_root, file_name)): file_name = _settings.DEFAULT_AVATAR default = True avatar_file = path.join(file_root, file_name) self.orig = Image(avatar_file) self.orig_width = self.orig.size().width() self.orig_height = self.orig.size().height() if not self.sizes_ok(with_original=True): if default: file_name = file_name[file_name.rfind('/')+1:] file_name = '%(width)i-%(name)s' % \ {'width': self.width, 'name': file_name} new_avatar = path.join(file_root, file_name) else: new_avatar = '' # Hack alert! self.resize(avatar_file, new_avatar) return (file_name, default) def as_url(self, path): from profile.avatars import path_to_url return path_to_url(path) def render(self, context): try: # If size is not an int, then it's a Variable, so try to resolve it. if not isinstance(self.width, int): self.width = int(self.width.resolve(context)) self.user = self.get_user(context) except Exception, e: print e return '' # just die... profile = self.user.get_profile() if not profile: return '' file_root = _settings.AVATARS_DIR file_name, defaulting = self.get_file(profile) file_path = path.join(file_root, file_name) return self.as_url(path.join(file_root, file_name))
class ResizedThumbnailNode(Node): def __init__(self, filename, dimensions): self.image_name = Variable(filename) # FIXME: Que pasa cuando no se explicita un ancho, y éste defaultea a # 0 px? Testear. self.height = int(dimensions[1]) self.width = int(dimensions[0]) # print dimensions def get_filename(self, context): file_path = self.image_name.resolve(context) if path.exists(file_path): self.image = Image(file_path) self.thumb_width, self.thumb_height = self.image.size().dimensions() i = file_path.rfind('/') return (file_path[:i], file_path[i+1:]) # TODO: # TODO: Implementar un wallpaper por defecto que se va a mostrar en # TODO: lugar de los wallpapers que falten mientras alguien lo arregla. raise MissingImageError(file_path) def should_resize(self): if self.thumb_width > self.width or self.thumb_height > self.height: return True return False def render(self, context): try: image_path, image_name = self.get_filename(context) except MissingImageError, e: return '' # Now to the thumbnail size = str(self.width) if self.height: size += 'x%s' % self.height thumb_root = path.join(image_path, 'thumbs', size) thumb_path = path.join(thumb_root, image_name) # The URL to the thumbnail. thumb_url = thumb_path.replace(settings.MEDIA_ROOT, settings.MEDIA_URL) # Resizing logic if not path.exists(thumb_path): # image_file = Image(path.join(image_path, image_name)) # if image_file.size().width() > self.width: if self.should_resize(): if not path.exists(thumb_root): makedirs(thumb_root) rule_width, rule_height = 0, 0 if self.thumb_width > self.width: rule_width = round( (float(self.width)*float(100))/float(self.thumb_width)) if self.thumb_height > self.height: rule_height = round( (float(self.height)*float(100))/float(self.thumb_height)) temp_width, temp_height = None, None if rule_height > rule_width: temp_width = (rule_height*self.thumb_width)/100 self.image.scale(temp_width, self.height) else: temp_height = (rule_width*self.thumb_height)/100 self.image.scale(self.width) if rule_width != rule_height: x_offset, y_offset = "0", "0" if self.thumb_width > self.width or \ self.thumb_height > self.height: if temp_width: x_offset = str((temp_width - self.width) / 2) if temp_height: y_offset = str((temp_height - self.height) / 2) self.image.crop(size + '+' + x_offset + '+' + y_offset) self.image.write(thumb_path) thumb_url = thumb_path.replace( settings.MEDIA_ROOT, settings.MEDIA_URL) else: # If I don't need to resize it, then I set the URL to the # original image file. thumb_url = settings.MEDIA_URL + \ image_path[len(settings.MEDIA_ROOT):] return thumb_url