#!/usr/bin/env python # coding=utf8 import sys from subprocess import Popen,PIPE # Fonction recompressant un JPEG avec une qualité donnée def shell_command(quality,filename): p1=Popen(["djpeg","-pnm","-dct","float",filename],stdout=PIPE) p2=Popen(["cjpeg","-quality",str(quality),"-dct","float","-restart", "0","-sample","1x1"],stdin=p1.stdout,stdout=PIPE) p3=Popen(["jpegtran","-trim","-optimize","-restart","0"], stdin=p2.stdout,stdout=PIPE) return p3.communicate()[0] # Fonction de calcul de taille de fichier, utilisée par find_param def compute(quality,filename): return len(shell_command(quality,filename)) # Prend un fichier en entrée et applique la fonction shell_command def generate(quality,filename_in,filename_out): output=shell_command(quality,filename_in) f=open(filename_out,"w") f.write(output) f.close() # Fonction générique de recherche dichotomique def find_param(minimum,maximum,search_result,function,func_parms): index =(minimum+maximum)/2 best_index =index best_result=function(best_index,func_parms) result =best_result while index not in (minimum,maximum) and best_result!=search_result: result=function(index,func_parms) if resultabs(search_result-result): best_result=result best_index =index index=(minimum+maximum)/2 if abs(search_result-best_result)>abs(search_result-result): best_result=result best_index =index return best_index # Passe en revue tous les arguments sauf le premier qui est la taille maxi for arg in sys.argv[2:]: quality=find_param(0,100,int(sys.argv[1])*1024,compute,arg) generate(quality,arg,arg)