
    UAi                     j    d dl mZ d dlmZ d dlZd dlZd dlZ	 	 d	dZd
dZ		 	 	 	 	 ddZ
d Z	 ddZy)    )Path)ImageNc           	         | j                  ||ft        j                        }t        ||z        }|}t	        d||z
  |z
        }|j                  dd||f      }	|j                  |d||z   |f      }
|j                  ||z   d||f      }|	j                  t	        dt        |	j                  |z              |ft        j                        }	|j                  t	        dt        |j                  |z              |ft        j                        }|	j                  |
j                  z   |j                  z   }t        j                  d||fd      }d}|j                  |	|df|	       ||	j                  z  }|j                  |
|df|
       ||
j                  z  }|j                  ||df|       |j                  ||ft        j                        S )zn
    Simulates cylindrical curvature by squeezing left/right edges
    and stretching back to full width.
       r   RGBAr   r   r   r   )	resizer   LANCZOSintmaxcropwidthnewpaste)overlay_rgbatarget_wtarget_h
edge_ratiosqueezeoverlaylwrwcwleftcenterrighttotal_wcurvedxs                  T/var/www/html/story-book/Story-Book-python-api/app/utils/generate_final_from_mask.py_make_curved_stripr!      s    !!8X"6FG	X
"	#B	B	Q2"	#B<<Ar8,-D\\2q"r'845FLL"r'1h9:E;;As4::#7898DemmTDLL#aU[[7%:!;<hGWEjj6<<'%++5GYYv2LAF	A
LL1vt$a4::oa
LL!Q(!v||*;!
LLA&==(H-u}}==    c                     | j                   \  }}t        ||z        }| j                  ||ft        j                        }t        j
                  d||fd      }|j                  |d|       |S )zm
    Applies horizontal perspective compression for back/right mug.
    Keeps image vertically straight.
    r   r   )r   r   )sizer   r	   r   r
   r   r   )imgsqueeze_factorwhnew_wsqueezedcanvass          r    _apply_back_mug_squeezer,   )   sc    
 88DAqN"#Ezz5!*emm4HYYv1v|4F
LL68,Mr"   c	                 "   |g d}t        j                  |       j                  d      }	t        j                  |      j                  d      }
t        j                  |      j                  d      }|
j                  |	j                  k7  r*|
j	                  |	j                  t         j
                        }
|
j                  \  }}t        j                  |
      }t        j                  ||dt        j                        \  }}t        j                  |d      \  }}}}g }t        d|      D ]1  }||   \  }}}}}|d	k  r||   d
   }|j                  |||||f       3 |j                  d        t        j                  d||fd      }|j                  \  }}t!        |      D ]  \  }\  }}}}}|t#        |      k  r||   n|d   \  } }!t%        | dz  |z        }"t%        |!dz  |z        }#t'        |"dz   t)        |#|            }#|j+                  |"d
|#|f      }$|$j	                  ||ft         j
                        }$t-        |$||||      }%|t#        |      dz
  k(  rt/        |%|      }%|j1                  |%||f|%        t        j                  |      }&|&dddddf   j3                  t        j4                        |j3                  t        j4                        dz  z  j3                  t        j6                        |&dddddf<   t        j8                  |	t        j:                  |&d            }'t=        |      t?        j@                         jB                   dz  }(|'j                  d      jE                  |(d       tG        |(      S )z
    Correct mug compositor:
    - WIDTH-wise slicing of overlay
    - Full coverage of print area
    - Cylindrical curvature preserved
    - Back mug uses perspective squeeze (NO rotation)
    N))r   (   )   P   )A   d   r   L      )connectivityr      r   c                     | d   S )Nr    )rs    r    <lambda>z*generate_mug_final_image.<locals>.<lambda>f   s    qtr"   )keyr   g      Y@)r   r   )r&           o@
_final.pngRGBb   quality)$r   openconvertr$   r	   r
   nparraycv2	thresholdTHRESH_BINARYconnectedComponentsWithStatsrangeappendsortr   	enumeratelenr   r   minr   r!   r,   r   astypefloat32uint8alpha_composite	fromarrayr   uuiduuid4hexsavestr))base_image_path	mask_pathoverlay_path
output_dirslice_rangesr   r   back_squeeze_factormask_threshbasemaskr   WHmask_np_binary
num_labelsstats	centroidsregionslblr   yr'   r(   areacxresultowohileft_pct	right_pctlxrxoverlay_slicer   	result_npfinalout_paths)                                            r    generate_mug_final_imager   8   sA   ( 5::o&..v6D::i ((-Djj&..v6GyyDII{{499emm499DAqhhtnG g{C9J9JKIAv&)&F&Fv\]&^#J5)GQ
# :1aD"9s^AAq!Q'( $ LL^L$YYv1v|4F\\FB'0?Aq!Q 3|#44LO,r:J 	) (U"b())e#r)*aR%  b!R_5 &,,aVU]]C $!
 Gq  ,2F
 	VaVV,? 1D  I!Q'!!"**-	

	#e	+	-fRXX aAg
 !!	6*E
 JTZZ\%5%5$6j"AAH	MM%h3x=r"   c                 N   | j                  d      } |j                  d      }|j                  d      }|j                  | j                  k7  r*|j                  | j                  t        j                        }t        j                  |       j                  t
        j                        }t        j                  |      j                  t
        j                        }t        j                  |      j                  t
        j                        dz  }t        j                  |dkD  j                  t
        j                              }|t        d      t        j                  |      \  }}}	}
t        j                  |j                  t
        j                              j                  |	|
ft        j                        }t        j                  |      j                  t
        j                        }|j                         }||||
z   |||	z   f   }t        j                   |d d d d d f   dd      }||||
z   |||	z   f   d	|z
  z  ||z  z   ||||
z   |||	z   f<   t        j                  t        j"                  |d
d      j                  t
        j                        d      S )Nr   r3   r?   g?z
Mask empty      )axisr   r   r4   )rF   r$   r	   r   r
   rG   rH   rS   rT   rI   findNonZerorU   
ValueErrorboundingRectrW   copyrepeatclip)rd   re   r   base_np
overlay_nprh   coordsr   rp   r'   r(   overlay_resizedrs   mm4s                  r    paste_by_mask_resizer      s   <<Doof%G<<DyyDII{{499emm4hhtn##BJJ/G'"))"**5Jhhtn##BJJ/%7G__gm33BHH=>F~&&!!&)JAq!Qooj&7&7&ABII1a&RWR_R_`O/*11"**=J\\^F!A#q1uA	1Q4Z=!!	,B!!AaC%1Q3,/1r6:Z"_LF1QqS5!AaC%<??27761c299"((CVLLr"   c                    |xs dj                         }d|v xs d|v }|rt        | |||      S t        j                  |       j	                  d      }t        j                  |      j	                  d      }t        j                  |      j	                  d      }	t        |||	      }
t        |      t        j                         j                   dz  }|
j	                  d      j                  |d	       t        |      S )
N mugcupr   r3   rA   r@   rB   rC   )lowerr   r   rE   rF   r   r   rX   rY   rZ   r[   r\   )r]   r^   r_   r`   unique_namenameis_mugrd   re   r   r}   outs               r    generate_final_image_from_maskr      s     2$$&Dd]+etmF'	
 	
 ::o&..v6D::i ((-Djj&..u5G tW5E
z


 0 01<
<C	MM%c2.s8Or"   ))\(?
ףp=
?)=
ףp=?)Nr   r   r   
   )N)pathlibr   PILr   numpyrG   rI   rX   r!   r,   r   r   r   r9   r"   r    <module>r      sP       
   >D( cJMB r"   