a #eR@sddlZddlZddlZddlmZddlmZddlmZddl m Z m Z m Z ddl mZddlmZdd lmZddlZd d ZGd d d eZGdddeZdS)N)TaskNestedView) exceptions)assets_directory_path)Image ImageDrawImageOps) HttpResponse)download_file_response)hex2rgbcCsJt|d}|}|}||kr@||8}|d||9}t|S)zd Linear normalization http://en.wikipedia.org/wiki/Normalization_%28image_processing%29 floatgo@)nparrayastypeminmaxr fromarray)imgarrZminvalZmaxvalr/webodm/app/api/imageuploads.py normalizesrc@seZdZdddZdS) ThumbnailNc$ Cs|||}||}tj|s*tzt|jj dd}|dkrPt t|jj dd}|dkst|dkrzt t |jj dd } t |jj d d } | d ks| d ks| d ks| d krt |jj d } |jj d} |jj d} g}d}| D]}ttt |d}t|dkr*t ||d|d|t| krTt| |nd|t| krpt | |ndd|d7}qt |jj dd}|dks|dkrt Wnt ytdYn0t|}|jdkrt|}|d}|j\}}tt|||}| dks.| dkr`||| d|| d|| d|| df}d}d}d}|dkrd|d}|d||d}|d||d}|||||||||f}t||tj }||||}}|D]}t!"|}|dt||d}|dd| |}|d d| |}|||} |||}!|j#| ||!|f| ||!|fg|d!ttdt$%|d"d#q|&||ft'(}"|j)|"d$|d%t*d&d'}#d(|#d)<|#+|",|"-|#Wd*S1s0Yd*S)+zO Generate a thumbnail on the fly for a particular task's image sizeirqualityKrdcenter_xz0.5center_ygg?Z draw_pointZ point_colorZ point_radius,)r"r"g?)xycolorradiuszoom1g? zInvalid query parametersRGBg?g@r&gY@r#r$r%g@)outlinewidthJPEG)formatrz image/jpeg) content_typeinlinezContent-DispositionN).get_and_check_taskget_image_pathospathisfilerNotFoundintrequest query_paramsget ValueErrorr getlistlistmapsplitlenappendr ValidationErrorropenmoderconvertrrrcroprscaleNEARESTrDrawellipsemathfloor thumbnailioBytesIOsaver writegetvalueclose)$selfr8pk project_pkimage_filenametask image_pathZ thumb_sizerrr draw_pointsZ point_colorsZpoint_radiusespointsipcoordsr'rwhZ scale_factorZoff_xZoff_ywinswshdrsxsyr#r$outputresrrrr:s                      z Thumbnail.get)NNr__name__ __module__ __qualname__r:rrrrrsrc@seZdZdddZdS) ImageDownloadNrcCs6|||}||}tj|s*tt||dS)z) Download a task's image attachment)r1r2r3r4r5rr6r )rTr8rUrVrWrXrYrrrr:s    zImageDownload.get)NNrrjrrrrrnsrn)r3rNrKtasksrrest_frameworkrZapp.models.taskrPILrrr django.httpr r commonr numpyr rrrnrrrrs      l