mirror of
				https://github.com/PaddlePaddle/FastDeploy.git
				synced 2025-10-31 11:56:44 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | ||
| # Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
 | ||
| #
 | ||
| # Licensed under the Apache License, Version 2.0 (the "License");
 | ||
| # you may not use this file except in compliance with the License.
 | ||
| # You may obtain a copy of the License at
 | ||
| #
 | ||
| #     http://www.apache.org/licenses/LICENSE-2.0
 | ||
| #
 | ||
| # Unless required by applicable law or agreed to in writing, software
 | ||
| # distributed under the License is distributed on an "AS IS" BASIS,
 | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||
| # See the License for the specific language governing permissions and
 | ||
| # limitations under the License.
 | ||
| """
 | ||
| 
 | ||
| import os
 | ||
| from pathlib import Path
 | ||
| 
 | ||
| from PIL import Image, ImageDraw, ImageFont
 | ||
| 
 | ||
| cur_directory = Path(__file__).parent.absolute()
 | ||
| FONT_PATH = os.path.join(cur_directory, "Roboto-Regular.ttf")
 | ||
| 
 | ||
| 
 | ||
| def render_single_image_with_timestamp(image: Image, number: str, rate: float, font_path: str = FONT_PATH):
 | ||
|     """
 | ||
|     函数功能: 给pil.image的图片渲染时间戳
 | ||
|     时间戳的大小为 min(width, height)的rate
 | ||
|     字体的颜色为黑色, 轮廓是白色, 轮廓的大小是字体的10%
 | ||
|     返回一个 Image 对象
 | ||
|     """
 | ||
|     draw = ImageDraw.Draw(image)  # 创建一个可绘制对象
 | ||
|     width, height = image.size  # 获取图片大小
 | ||
|     font_size = int(min(width, height) * rate)  # 设置字体大小
 | ||
|     outline_size = int(font_size * 0.1)  # 设置轮廓大小
 | ||
|     font = ImageFont.truetype(font_path, font_size)  # 加载字体文件, 设置字体大小
 | ||
|     x = 0
 | ||
|     y = 0  # 文本的x坐标, y坐标
 | ||
| 
 | ||
|     # 绘制黑色的时间戳,白色的边框
 | ||
|     draw.text(
 | ||
|         (x, y),
 | ||
|         number,
 | ||
|         font=font,
 | ||
|         fill=(0, 0, 0),
 | ||
|         stroke_width=outline_size,
 | ||
|         stroke_fill=(255, 255, 255),
 | ||
|     )
 | ||
| 
 | ||
|     return image
 | ||
| 
 | ||
| 
 | ||
| def timestamp_converting(time_stamp_in_seconds):
 | ||
|     """
 | ||
|     convert timestamp format from seconds to hr:min:sec
 | ||
|     """
 | ||
|     # get hours
 | ||
|     hours = 0
 | ||
|     while time_stamp_in_seconds >= 3600:
 | ||
|         hours += 1
 | ||
|         time_stamp_in_seconds -= 3600
 | ||
|     # get minutes
 | ||
|     mins = 0
 | ||
|     while time_stamp_in_seconds >= 60:
 | ||
|         mins += 1
 | ||
|         time_stamp_in_seconds -= 60
 | ||
|     time_hours = f"{int(hours):02d}"
 | ||
|     time_mins = f"{int(mins):02d}"
 | ||
|     time_secs = f"{time_stamp_in_seconds:05.02f}"
 | ||
|     fi_time_stamp = time_hours + ":" + time_mins + ":" + time_secs
 | ||
| 
 | ||
|     return fi_time_stamp
 | ||
| 
 | ||
| 
 | ||
| def get_timestamp_for_uniform_frame_extraction(num_frames, frame_id, duration):
 | ||
|     """
 | ||
|     function: get the timestamp of a frame, 在均匀抽帧时用。
 | ||
| 
 | ||
|     num_frames: 总帧数
 | ||
|     frameid_list: 被抽帧的帧的索引
 | ||
|     duration: 视频的总时长
 | ||
|     return: timestamp; xx:xx:xx (str)
 | ||
|     """
 | ||
|     time_stamp = duration * 1.0 * frame_id / num_frames
 | ||
| 
 | ||
|     return time_stamp
 | ||
| 
 | ||
| 
 | ||
| def render_frame_timestamp(frame, timestamp, font_rate=0.1):
 | ||
|     """
 | ||
|     函数功能, 给frame, 按照顺序将 index 渲染上去
 | ||
|     逻辑思路: 把index渲染到图片的左上方
 | ||
| 
 | ||
|     frame: 帧,PIL.Image object
 | ||
|     timestamp: 时间戳,单位是秒
 | ||
|     font_rate: 字体大小占 min(wi, hei)的比率
 | ||
|     """
 | ||
| 
 | ||
|     time_stamp = "time: " + timestamp_converting(timestamp)
 | ||
|     new_frame = render_single_image_with_timestamp(frame, time_stamp, font_rate)
 | ||
| 
 | ||
|     return new_frame
 | 
