Mercurial > hg > MPIWGWeb
comparison MPIWGProjects.py @ 127:4a8a532a05ba
scale images
author | dwinter |
---|---|
date | Thu, 30 May 2013 20:55:07 +0200 |
parents | 220f37701e8d |
children | a9ad7dd7a8b2 |
comparison
equal
deleted
inserted
replaced
123:220f37701e8d | 127:4a8a532a05ba |
---|---|
709 items = self.objectValues(spec='MPIWGProject_image') | 709 items = self.objectValues(spec='MPIWGProject_image') |
710 # sort by place | 710 # sort by place |
711 return sorted(items, key=lambda x:int(getattr(x, 'place', 0))) | 711 return sorted(items, key=lambda x:int(getattr(x, 'place', 0))) |
712 | 712 |
713 | 713 |
714 | |
715 def scaleImage(self,REQUEST=None,RESPONSE=None): | |
716 """scale the last image""" | |
717 from PIL import Image; | |
718 from cStringIO import StringIO; | |
719 import ImageFilter | |
720 | |
721 | |
722 | |
723 | |
724 images = self.getImageList(); | |
725 if len(images)>0: | |
726 img = images[-1] #nimmt das letze | |
727 | |
728 logging.debug(img) | |
729 datStringIO = StringIO(); | |
730 """ | |
731 data=img.data | |
732 if isinstance(data, str): | |
733 datStringIO.write(data) | |
734 else: | |
735 | |
736 while data is not None: | |
737 datStringIO.write(data.data) | |
738 data=data.next | |
739 | |
740 """ | |
741 | |
742 logging.debug(img.absolute_url()) | |
743 | |
744 url = img.absolute_url() | |
745 if not url.startswith("http"): | |
746 url=REQUEST['URL0']+url | |
747 ul = urllib.urlopen(url) | |
748 datStringIO = StringIO(ul.read()); | |
749 | |
750 | |
751 try: | |
752 pilImg = Image.open(datStringIO) | |
753 | |
754 | |
755 except: | |
756 logging.error("scale image input:"+self.getId()) | |
757 return | |
758 | |
759 w,h = pilImg.size | |
760 logging.debug("oldsize: %s %s"%(w,h)) | |
761 targetW=120. | |
762 targetH=75. | |
763 | |
764 if targetW == w and targetH == h: | |
765 return | |
766 facW=targetW/w | |
767 | |
768 h1 = int(h*facW) | |
769 | |
770 if h1<targetH: #bild zu klein in h | |
771 facH=targetH/h | |
772 | |
773 w1=int(w*facH) | |
774 | |
775 fs = min(max(int(1/facH)+1,3),10) | |
776 logging.debug(fs) | |
777 if (1/facH) > 2: | |
778 pilImg = pilImg.filter(ImageFilter.BLUR) | |
779 | |
780 try: | |
781 pilImg = pilImg.filter(ImageFilter.MaxFilter(fs)) | |
782 except: | |
783 pilImg = pilImg.filter(ImageFilter.MaxFilter(fs-1)) | |
784 | |
785 logging.debug("Xnew size: %s %s"%(w1,targetH)) | |
786 res = pilImg.resize((w1,int(targetH)),Image.ANTIALIAS); | |
787 | |
788 | |
789 else: | |
790 fs = min(max(int(1/facW)+1,3),10) | |
791 logging.debug(fs) | |
792 | |
793 if (1/facW) > 2: | |
794 try: | |
795 pilImg = pilImg.filter(ImageFilter.BLUR) | |
796 except: | |
797 pass #some image types cannot be filter, just ignore | |
798 | |
799 try: | |
800 pilImg = pilImg.filter(ImageFilter.MaxFilter(fs)) | |
801 except: | |
802 | |
803 | |
804 try: | |
805 pilImg = pilImg.filter(ImageFilter.MaxFilter(fs-1)) | |
806 except: | |
807 pass | |
808 logging.debug("ynew size: %s %s"%(targetW,h1)) | |
809 res = pilImg.resize((int(targetW),h1)) | |
810 | |
811 nw,nh = res.size | |
812 | |
813 cutW1=int(nw/2-(targetW/2)) | |
814 cutW2=int(nw/2+(targetW/2)) | |
815 | |
816 cutH1=int(nh/2-(targetH/2)) | |
817 cutH2=int(nh/2+(targetH/2)) | |
818 | |
819 | |
820 | |
821 res2 = res.crop((cutW1,cutH1,cutW2,cutH2)) | |
822 | |
823 outS = StringIO() | |
824 | |
825 #res2.save("/tmp/"+self.getId()+".jpg") | |
826 | |
827 try: | |
828 res2.save(outS,"JPEG") | |
829 | |
830 self.addImage(outS, None, RESPONSE, filename="thumb.jpg") | |
831 | |
832 except: | |
833 logging.error("scale image:"+self.getId()) | |
834 | |
835 | |
836 | |
714 def addImage(self, fileHd, caption, RESPONSE=None, filename=None): | 837 def addImage(self, fileHd, caption, RESPONSE=None, filename=None): |
715 """add an MPIWG_Project_image""" | 838 """add an MPIWG_Project_image""" |
716 | 839 |
717 if not filename: | 840 if not filename: |
718 filename = fileHd.filename | 841 filename = fileHd.filename |
722 | 845 |
723 newImage = MPIWGProject_image(filename, filename, fileHd) | 846 newImage = MPIWGProject_image(filename, filename, fileHd) |
724 | 847 |
725 self._setObject(filename, newImage) | 848 self._setObject(filename, newImage) |
726 obj = getattr(self, filename) | 849 obj = getattr(self, filename) |
727 obj.caption = caption[:] | 850 if caption is None: |
851 obj.caption=None | |
852 else: | |
853 obj.caption = caption[:] | |
854 | |
728 obj.enabled = True; | 855 obj.enabled = True; |
729 obj.place = self._getLastImageNumber() + 1 | 856 obj.place = self._getLastImageNumber() + 1 |
730 obj.id = filename | 857 obj.id = filename |
731 | 858 |
732 # invalidate thumbnail | 859 # invalidate thumbnail |
2066 if RESPONSE is not None: | 2193 if RESPONSE is not None: |
2067 RESPONSE.write(log) | 2194 RESPONSE.write(log) |
2068 RESPONSE.flush() | 2195 RESPONSE.flush() |
2069 else: | 2196 else: |
2070 return fulllog | 2197 return fulllog |
2071 | 2198 |
2199 def scaleImages(self,REQUEST=None): | |
2200 """scaleImages""" | |
2201 prjs = self.getProjectsAsList() | |
2202 for prj in prjs: | |
2203 prj.scaleImage(REQUEST=REQUEST) | |
2204 logging.debug(prj.getId()) | |
2205 | |
2072 | 2206 |
2073 def manage_addMPIWGProjectFolderForm(self): | 2207 def manage_addMPIWGProjectFolderForm(self): |
2074 """form for adding a MPIWGProjectFolder""" | 2208 """form for adding a MPIWGProjectFolder""" |
2075 pt = PageTemplateFile('zpt/project/manage_add_MPIWGProjectFolder', globals()).__of__(self) | 2209 pt = PageTemplateFile('zpt/project/manage_add_MPIWGProjectFolder', globals()).__of__(self) |
2076 return pt() | 2210 return pt() |