def crop_scale(self, dimensions: Tuple[int, int]) -> 'Segment': """ Returns ------- A new Segment, cropped and/or scaled as necessary to reach specified dimensions """ segment = self.copy() dimensions = Dimensions(*dimensions) def blur(image): #return cv2.GaussianBlur(image.astype(float),(99,99),0) return cv2.blur(image.astype(float), (30, 30), 0) #if segment.aspect_ratio != dimensions.aspect_ratio: # Crop segment to match aspect ratio #segment = segment.crop_to_aspect_ratio(dimensions.aspect_ratio) #if segment.dimensions != dimensions: # Resize segment to reach final dimensions #segment = segment.resize(dimensions) replace_width = dimensions.width replace_height = dimensions.height if segment.aspect_ratio != replace_width / replace_height: ##########################################Below 1 AR################################################## if segment.aspect_ratio <= 1: #print("below 1") if segment.size[0] != replace_width: segment = segment.resize(width=replace_width) if segment.size[1] != replace_height: segment = segment.resize(height=replace_height) segment = segment.set_position("center") background1 = segment.crop(x1=0, width=(segment.w / 2)) background2 = segment.crop(x1=(segment.w / 2), width=(segment.w / 2)) if segment.aspect_ratio != 1: #print("Not 1:1") background1 = background1.resize( width=(replace_width - segment.w) / 2) background2 = background2.resize( width=((replace_width - segment.w) / 2) + 1) background1 = background1.set_position( ("left", 'center')).fl_image(blur) background2 = background2.set_position( ("right", 'center')).fl_image(blur) segment = CompositeVideoClip( [background1, background2, segment], size=(replace_width, replace_height)) segment.effects = self.effects #########################################Above 1080 ratio############################################### elif segment.aspect_ratio > round(replace_width / replace_height, 2): #print("above 1.7") if segment.size[1] != replace_height: segment = segment.resize(height=replace_height) if segment.size[0] != replace_width: segment = segment.resize(width=replace_width) test = (replace_height - segment.h) / 2 segment = segment.set_position("center") background1 = segment.crop( y1=0, height=((replace_height - segment.h) / 2)) background2 = segment.crop(y1=segment.h - test, height=test) background1 = background1.set_position( ('center', 'top')).fl_image(blur) background2 = background2.set_position( ('center', 'bottom')).fl_image(blur) segment = CompositeVideoClip( [background1, background2, segment], size=(replace_width, replace_height)) segment.effects = self.effects ######################################other####################################################### elif segment.aspect_ratio > 1 and segment.aspect_ratio < round( replace_width / replace_height, 2): #print('midway between') if segment.size[0] != replace_width: segment = segment.resize(width=replace_width) if segment.size[1] != replace_height: segment = segment.resize(height=replace_height) segment = segment.set_position("center") background1 = segment.crop(x1=0, width=(segment.w / 2)) background2 = segment.crop(x1=(segment.w / 2), width=(segment.w / 2)) background1 = background1.set_position( ("left", 'center')).fl_image(blur) background2 = background2.set_position( ("right", 'center')).fl_image(blur) segment = CompositeVideoClip( [background1, background2, segment], size=(replace_width, replace_height)) segment.effects = self.effects ############################################################################################# if segment.w != replace_width and segment.h != replace_height: segment = segment.resize((replace_width, replace_height)) #print("On Aspect, too big or small") return segment
def build_start_title(vid, title_end, texts, text_i): dirname = os.path.dirname(__file__) # Relative path to the folder # Images maila = "Karttu.png" logo = "logo.png" # Fonts font = "Ebrima-Bold" # font = "Fixedsys Regular" fontsize = 150 color = "#e94b3cff" stroke_color = "#1d1b1b" if float(title_end) - 4.0 > 0.0: clip = vid.subclip(float(title_end) - 4.0, title_end) else: # if start is shorter than 4 s rate = title_end / 4 clip = vid.subclip(0, title_end).speedx(rate) t = texts[text_i] t = t.replace('\\n', '\n') t = t.split(";") # separate players and event. Example: player1 vs. player2; Event 2020 if len(t) == 2: players = t[0] event = t[1] else: event = t[0] players = "" maila_img = ImageClip(os.path.join(dirname ,maila), duration = 4)\ .resize(height = int(clip.size[1] * 0.7)) logo_img = ImageClip(os.path.join(dirname ,logo), duration = 4)\ .resize(width = maila_img.size[0] + 100)\ .set_position(("center", "top")) maila_img = maila_img.margin(top = logo_img.size[1],\ left = int((logo_img.size[0] - maila_img.size[0]) / 2),\ right = int((logo_img.size[0] - maila_img.size[0]) / 2),\ opacity = 0) images = CompositeVideoClip([maila_img,logo_img]) images_rot = images.set_position("center")\ .resize(lambda t: min(0.2 + t*1.5 , 1))\ .rotate(lambda t: 500 * (tanh(t*4 + 0.5) * -5 + 5), resample = "nearest") event_txt = TextClip(event, stroke_color = stroke_color,\ stroke_width = 4, color=color,\ font= font,\ kerning = 5,\ fontsize=fontsize)\ .set_duration(4) event_txt = event_txt.resize(width = clip.size[0] / 2 - 300) event_txt = event_txt.set_pos(lambda t:(min(clip.size[0]/2 + 100,-800 + t * 1500),clip.size[1]/2)) player_txt = TextClip(players,\ stroke_color = stroke_color,\ stroke_width = 4, color=color,\ font=font,\ kerning = 5,\ fontsize=fontsize)\ .set_duration(4) player_txt = player_txt.set_pos(lambda t:(max(clip.size[0]/2 - player_txt.size[0]- 100, clip.size[0] + 600 + t * -1800),clip.size[1]/2 - player_txt.size[1]/2)) mask_left = np.zeros((clip.size[1],clip.size[0], 4)) mask_right = B = np.copy(mask_left) mask_left = cv2.rectangle(mask_left, (0, 0), (int(clip.size[0]/2), clip.size[1]), (255,255,255,255), -1) mask_right = cv2.rectangle(mask_right, (int(clip.size[0]/2), 0), (clip.size[0], clip.size[1]), (255,255,255,255), -1) mask_left = ImageClip(mask_left, duration=2, ismask=True) mask_right = ImageClip(mask_right, duration=2, ismask=True) # cv2.imwrite("kala.png",mask_right) comp_clip = CompositeVideoClip([clip, event_txt, clip.set_mask(mask_left)]) comp_clip = CompositeVideoClip([comp_clip, player_txt, comp_clip.set_mask(mask_right), images_rot]) return comp_clip, text_i + 1