def blit_on(self, picture, t): # Monkey patch 'blit_on' to place subtitle relative to its dynamic size # The block below copied from moviepy. ################################################################################################# hf, wf = framesize = picture.shape[:2] if self.ismask and picture.max(): return np.minimum(1, picture + self.blit_on(np.zeros(framesize), t)) ct = t - self.start # clip time # GET IMAGE AND MASK IF ANY img = self.get_frame(ct) mask = self.mask.get_frame(ct) if self.mask else None if mask is not None and ((img.shape[0] != mask.shape[0]) or (img.shape[1] != mask.shape[1])): img = self.fill_array(img, mask.shape) hi, wi = img.shape[:2] ################################################################################################# pos_x = (wf - wi) / 2 # center pos_y = margin_h if vpos == 'top' else (hf - hi - margin_h) pos = map(int, (pos_x, pos_y)) from moviepy.video.tools.drawing import blit return blit(img, picture, pos, mask=mask, ismask=self.ismask)
def blit_on(self, picture, t): """ Returns the result of the blit of the clip's frame at time `t` on the given `picture`, the position of the clip being given by the clip's ``pos`` attribute. Meant for compositing. """ hf, wf = framesize = picture.shape[:2] if self.ismask and picture.max(): return np.minimum(1, picture + self.blit_on(np.zeros(framesize), t)) ct = t - self.start # clip time # GET IMAGE AND MASK IF ANY img = self.get_frame(ct) mask = self.mask.get_frame(ct) if self.mask else None if mask is not None and ((img.shape[0] != mask.shape[0]) or (img.shape[1] != mask.shape[1])): img = self.fill_array(img, mask.shape) hi, wi = img.shape[:2] # SET POSITION pos = self.pos(ct) # preprocess short writings of the position if isinstance(pos, str): pos = { "center": ["center", "center"], "left": ["left", "center"], "right": ["right", "center"], "top": ["center", "top"], "bottom": ["center", "bottom"], }[pos] else: pos = list(pos) # is the position relative (given in % of the clip's size) ? if self.relative_pos: for i, dim in enumerate([wf, hf]): if not isinstance(pos[i], str): pos[i] = dim * pos[i] if isinstance(pos[0], str): D = {"left": 0, "center": (wf - wi) / 2, "right": wf - wi} pos[0] = D[pos[0]] if isinstance(pos[1], str): D = {"top": 0, "center": (hf - hi) / 2, "bottom": hf - hi} pos[1] = D[pos[1]] pos = map(int, pos) return blit(img, picture, pos, mask=mask, ismask=self.ismask)
def blit_on(self, picture, t): """ Returns the result of the blit of the clip's frame at time `t` on the given `picture`, the position of the clip being given by the clip's ``pos`` attribute. Meant for compositing. """ hf, wf = sizef = picture.shape[:2] if self.ismask and picture.max() != 0: return np.maximum(picture, self.blit_on(np.zeros(sizef), t)) ct = t - self.start # clip time # GET IMAGE AND MASK IF ANY img = self.get_frame(ct) mask = (None if (self.mask is None) else self.mask.get_frame(ct)) hi, wi = img.shape[:2] # SET POSITION pos = self.pos(ct) # preprocess short writings of the position if isinstance(pos,str): pos = { 'center': ['center','center'], 'left': ['left','center'], 'right': ['right','center'], 'top':['center','top'], 'bottom':['center','bottom']}[pos] else: pos = list(pos) # is the position relative (given in % of the clip's size) ? if self.relative_pos: for i, dim in enumerate(wf, hf): if not isinstance(pos[i], str): pos[i] = dim * pos[i] if isinstance(pos[0], str): D = {'left': 0, 'center': (wf - wi) / 2, 'right': wf - wi} pos[0] = D[pos[0]] if isinstance(pos[1], str): D = {'top': 0, 'center': (hf - hi) / 2, 'bottom': hf - hi} pos[1] = D[pos[1]] pos = map(int, pos) return blit(img, picture, pos, mask=mask, ismask=self.ismask)
def blit_on(self, picture, t): """Returns the result of the blit of the clip's frame at time `t` on the given `picture`, the position of the clip being given by the clip's ``pos`` attribute. Meant for compositing. """ wf, hf = picture.size ct = t - self.start # clip time # GET IMAGE AND MASK IF ANY img = self.get_frame(ct).astype("uint8") im_img = Image.fromarray(img) if self.mask is not None: mask = (self.mask.get_frame(ct) * 255).astype("uint8") im_mask = Image.fromarray(mask).convert("L") if im_img.size != im_mask.size: bg_size = ( max(im_img.size[0], im_mask.size[0]), max(im_img.size[1], im_mask.size[1]), ) im_img_bg = Image.new("RGB", bg_size, "black") im_img_bg.paste(im_img, (0, 0)) im_mask_bg = Image.new("L", bg_size, 0) im_mask_bg.paste(im_mask, (0, 0)) im_img, im_mask = im_img_bg, im_mask_bg else: im_mask = None wi, hi = im_img.size # SET POSITION pos = self.pos(ct) # preprocess short writings of the position if isinstance(pos, str): pos = { "center": ["center", "center"], "left": ["left", "center"], "right": ["right", "center"], "top": ["center", "top"], "bottom": ["center", "bottom"], }[pos] else: pos = list(pos) # is the position relative (given in % of the clip's size) ? if self.relative_pos: for i, dim in enumerate([wf, hf]): if not isinstance(pos[i], str): pos[i] = dim * pos[i] if isinstance(pos[0], str): D = {"left": 0, "center": (wf - wi) / 2, "right": wf - wi} pos[0] = D[pos[0]] if isinstance(pos[1], str): D = {"top": 0, "center": (hf - hi) / 2, "bottom": hf - hi} pos[1] = D[pos[1]] pos = map(int, pos) return blit(im_img, picture, pos, mask=im_mask)