最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)照片集變成視頻的代碼實(shí)現(xiàn)

 更新時(shí)間:2024年10月14日 08:26:12   作者:shigen01  
看著電腦里亂七八糟的照片,有大有小,寬高不一,突然想找個(gè)方式把他們統(tǒng)一起來(lái),然后做成視頻更好,所以本文給大家介紹了python實(shí)現(xiàn)照片集變成視頻的實(shí)現(xiàn),需要的朋友可以參考下

背景

一個(gè)安靜的下午,看著電腦里亂七八糟的照片,有大有小,寬高不一,突然想找個(gè)方式把他們統(tǒng)一起來(lái),然后做成視頻更好(其實(shí)我在上高中的時(shí)候就喜歡把照片做成視頻,覺(jué)得意義很大)。要滿(mǎn)足批量、自動(dòng)化,肯定得動(dòng)用代碼了。于是首先我列舉了下我希望的功能:

  • 照片來(lái)源:制定的目錄下所有的文件格式為照片的文件,按照照片的文件名進(jìn)行排序

  • 照片質(zhì)量:按照目前的720P、1080P、甚至是2K、4K的畫(huà)質(zhì)來(lái)生成照片視頻

  • 照片橫豎:可以自定義指定照片是橫屏還是豎屏

  • 照片時(shí)間:可以自定義每一張照片的放映時(shí)間

  • 照片比例:這個(gè)也是最為重要的,對(duì)此我分成了如下幾種case:

    圖片的寬度 < 視頻寬度 * 50% or 圖片的高度 < 視頻高度 * 50%:舍棄掉

    圖片寬度 < 視頻寬度 or 圖片的高度 < 視頻高度:居中等比放大,直到高度 = 視頻高度 or 寬度 = 視頻寬度=

    其它尺寸,圖片居中等比縮小,直到高度 = 視頻高度 or 寬度 = 視頻寬度

這種照片比例的放大居中,基本上是強(qiáng)迫癥患者的福音了,嚴(yán)格的居中對(duì)齊。

實(shí)現(xiàn)

依托強(qiáng)大的python庫(kù),這里主要用到的工具庫(kù)有:

  • Pillow,源代碼有簡(jiǎn)單、精煉的解釋?zhuān)?strong>Pillow is the friendly PIL fork by Alex Clark and Contributors.PIL is the Python Imaging Library by Fredrik Lundh and Contributors. 機(jī)器學(xué)習(xí)、圖像識(shí)別等場(chǎng)景用到的最多,這里主要使用它來(lái)調(diào)整圖片的大小
  • MoviePy, 是一個(gè)用于視頻編輯的 Python 庫(kù)??梢?strong>剪輯視頻、添加音頻和字幕調(diào)整視頻幀簡(jiǎn)單的特效等等。這里主要是根據(jù)照片序列生成視頻。

介紹完主要的庫(kù)之后,就是代碼環(huán)節(jié)了,代碼里注釋較多,輕松入手,不做過(guò)多的解釋?zhuān)?/p>

 # create viode from a dictionary which contains image or video files
 import os
 from PIL import Image
 from moviepy.editor import ImageSequenceClip
 ?
 ?
 def resize_and_crop(image, target_size):
     """將圖片根據(jù)給定的大小進(jìn)行縮放和裁剪
 ?
     1. 圖片的寬度 < 視頻寬度 * 50% or 圖片的高度 < 視頻高度 * 50%:舍棄掉
     2. 圖片寬度 < 視頻寬度 or 圖片的高度 < 視頻高度:居中等比放大,直到高度 = 視頻高度 or 寬度 = 視頻寬度
     3. 圖片居中等比縮小,直到高度 = 視頻高度 or 寬度 = 視頻寬度
 ?
     Args:
         image (str): 原圖片文件路徑
         target_size (tuple): 視頻大小(寬度, 高度)
 ?
     Returns:
         Image: 調(diào)整后的圖片,可能為空
     """
     img = Image.open(image)
     video_width, video_height = target_size
 ?
     # 檢查條件1:如果原圖寬度或高度小于視頻尺寸的50%,則返回None
     if img.width < video_width * 0.5 or img.height < video_height * 0.5:
         return None
 ?
     # 計(jì)算目標(biāo)縮放比例
     scale_x = video_width / img.width
     scale_y = video_height / img.height
 ?
     # 根據(jù)需要的寬度和高度選擇縮放比例
     if img.width < video_width or img.height < video_height:
         # 居中等比放大
         scale = max(scale_x, scale_y)
     else:
         # 居中等比縮小
         scale = min(scale_x, scale_y)
 ?
     # 放大或縮小圖片
     new_size = (int(img.width * scale), int(img.height * scale))
     img = img.resize(new_size, Image.ANTIALIAS)
 ?
     # 計(jì)算裁剪框的位置
     left = (img.width - video_width) // 2
     top = (img.height - video_height) // 2
     right = left + video_width
     bottom = top + video_height
 ?
     # 裁剪并返回最終圖片
     img = img.crop((left, top, right, bottom))
     return img
 ?
 ?
 def create_video_from_images(folder_path,
                              out_put_file_name='output_video.mp4',
                              resolution='720p',
                              is_horizontal=True,
                              duration=3):
     """通過(guò)照片生成視頻
 ?
     Args:
         folder_path (_type_): 文件夾路徑
         out_put_file_name (str, optional): _description_. 視頻輸出路徑 Defaults to 'output_video.mp4'.
         resolution (str, optional): _description_. 視頻清晰度 Defaults to '720p'.
         is_horizontal (bool, optional): _description_. 是否是橫屏 Defaults to True.
         duration (int, optional): _description_. 每張照片的放映時(shí)長(zhǎng) Defaults to 3.
 ?
     Raises:
         ValueError: 視頻清晰度錯(cuò)誤
     """
     resolution_mapping = {
         '720p': (1280, 720),
         '1080p': (1920, 1080),
         '2k': (2560, 1440),
         '4k': (3840, 2160),
     }
 ?
     if resolution not in resolution_mapping:
         raise ValueError(
             "Invalid resolution. Choose from '720p', '1080p', '2k', '4k'.")
 ?
     target_size = resolution_mapping[resolution]
     if not is_horizontal:
         target_size = (target_size[1], target_size[0])
 ?
     images = []
 ?
     # 讀取文件夾下的文件并按照文件名排序
     for filename in sorted(os.listdir(folder_path)):
         if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
             img = resize_and_crop(os.path.join(folder_path, filename),
                                   target_size)
             if img:
                 images.append(img)
 ?
     # 照片的臨時(shí)位置
     temp_files = []
     for i, img in enumerate(images):
         temp_file = f'temp_image_{i}.png'
         img.save(temp_file)
         temp_files.append(temp_file)
 ?
     # 創(chuàng)建視頻
     clip = ImageSequenceClip(temp_files, fps=1 / duration)
     output_file = os.path.join(folder_path, out_put_file_name)
     clip.write_videofile(output_file, codec='libx264')
 ?
     # 清除臨時(shí)文件
     for temp_file in temp_files:
         os.remove(temp_file)
 ?
 ?
 if __name__ == '__main__':
     create_video_from_images(
         folder_path='/Users/xxxx/Downloads/xxx/imgs',
         is_horizontal=False,
         resolution='720p')

我們執(zhí)行腳本,這里是控制臺(tái)輸出:

再來(lái)看看視頻輸出:

標(biāo)準(zhǔn)的720P H264編碼,3&,21s的時(shí)長(zhǎng)。有一張圖是橫屏的圖,這里生成的視頻中也根據(jù)高度放大進(jìn)行了居中裁剪:

整體的感覺(jué)還不錯(cuò),特此寫(xiě)個(gè)博客分享出來(lái)。當(dāng)然還有很多的優(yōu)化點(diǎn):

優(yōu)化項(xiàng)

其實(shí)做的還是相當(dāng)?shù)拇植?,但是基本上還是省事兒了。考慮到的優(yōu)化點(diǎn)有:

  • 指定背景音樂(lè)并實(shí)現(xiàn)照片卡點(diǎn)
  • 加上隨機(jī)的特效切換

咳,目前想到的就這么多。作為工具,我覺(jué)得越簡(jiǎn)單越好,需要效率和我開(kāi)發(fā)時(shí)間的權(quán)衡。

到此這篇關(guān)于python實(shí)現(xiàn)照片集變成視頻的代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python照片集變成視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Matplotlib使用和繪制二維圖表教程

    Matplotlib使用和繪制二維圖表教程

    Matplotlib是一個(gè)強(qiáng)大的Python繪圖庫(kù),可以用來(lái)繪制各種靜態(tài)、動(dòng)態(tài)和交互式的圖表,文章介紹了Matplotlib的基本概念、繪制折線(xiàn)圖、散點(diǎn)圖、柱狀圖、直方圖和餅圖等方法,并詳細(xì)解釋了Matplotlib的三層結(jié)構(gòu)
    2025-02-02
  • Python3中bytes類(lèi)型轉(zhuǎn)換為str類(lèi)型

    Python3中bytes類(lèi)型轉(zhuǎn)換為str類(lèi)型

    Python 3最重要的新特性之一是對(duì)字符串和二進(jìn)制數(shù)據(jù)流做了明確的區(qū)分。這篇文章主要介紹了Python3中bytes類(lèi)型轉(zhuǎn)換為str類(lèi)型的相關(guān)知識(shí),需要的朋友可以參考下
    2018-09-09
  • Python自動(dòng)化運(yùn)維和部署項(xiàng)目工具Fabric使用實(shí)例

    Python自動(dòng)化運(yùn)維和部署項(xiàng)目工具Fabric使用實(shí)例

    Fabric是一個(gè)Python庫(kù),只要目標(biāo)機(jī)器支持ssh訪問(wèn),就可以借助fabric來(lái)進(jìn)行遠(yuǎn)程操作(如在host1上對(duì)host2遠(yuǎn)程運(yùn)行shell命令),顯然,由于fabric是個(gè)Python package,故其它Python package都可以被import到fabric特有的fabfile.py腳本中
    2016-09-09
  • Python獲取本機(jī)所有網(wǎng)卡IP/MAC地址的三種方法

    Python獲取本機(jī)所有網(wǎng)卡IP/MAC地址的三種方法

    本文詳細(xì)介紹了三種Python獲取網(wǎng)絡(luò)適配器信息的解決方案,,支持Windows、Linux和Mac系統(tǒng),每種方案都有其優(yōu)缺點(diǎn),推薦使用netifaces庫(kù),因其可以完美適配多網(wǎng)卡場(chǎng)景,需要的朋友可以參考下
    2026-04-04
  • python貪吃蛇核心功能實(shí)現(xiàn)上

    python貪吃蛇核心功能實(shí)現(xiàn)上

    我想大家都玩過(guò)諾基亞上面的貪吃蛇吧,這篇文章將帶你一步步用python語(yǔ)言實(shí)現(xiàn)一個(gè)snake小游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-09-09
  • 詳解opencv Python特征檢測(cè)及K-最近鄰匹配

    詳解opencv Python特征檢測(cè)及K-最近鄰匹配

    這篇文章主要介紹了詳解opencv Python特征檢測(cè)及K-最近鄰匹配,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python使用Selenium+BeautifulSoup爬取淘寶搜索頁(yè)

    Python使用Selenium+BeautifulSoup爬取淘寶搜索頁(yè)

    這篇文章主要為大家詳細(xì)介紹了Python使用Selenium+BeautifulSoup爬取淘寶搜索頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python根據(jù)字符串語(yǔ)義相似度計(jì)算的多種實(shí)現(xiàn)算法

    Python根據(jù)字符串語(yǔ)義相似度計(jì)算的多種實(shí)現(xiàn)算法

    這篇文章主要介紹了Python根據(jù)字符串語(yǔ)義相似度計(jì)算的多種實(shí)現(xiàn)算法,以下是幾種基于語(yǔ)義的字符串相似度計(jì)算方法,每種方法都會(huì)返回0.0到1.0之間的相似度分?jǐn)?shù)(保留一位小數(shù)),需要的朋友可以參考下
    2025-07-07
  • python實(shí)現(xiàn)圖片素描效果

    python實(shí)現(xiàn)圖片素描效果

    這篇文章主要介紹了python如何實(shí)現(xiàn)圖片素描效果,幫助大家利用python處理圖片,感興趣的朋友可以了解下
    2020-09-09
  • Python通過(guò)2種方法輸出帶顏色字體

    Python通過(guò)2種方法輸出帶顏色字體

    這篇文章主要介紹了python通過(guò)2種方法輸出帶顏色字體,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

长子县| 洪雅县| 宁明县| 霸州市| 南汇区| 博罗县| 庆云县| 长兴县| 枣庄市| 扬州市| 含山县| 长宁区| 柯坪县| 镇远县| 黎川县| 循化| 壶关县| 屯门区| 德阳市| 平邑县| 天镇县| 宁南县| 休宁县| 荃湾区| 保康县| 沙湾县| 平潭县| 弥渡县| 大田县| 浏阳市| 墨玉县| 龙井市| 平昌县| 涞源县| 金乡县| 深水埗区| 华容县| 通道| 富阳市| 菏泽市| 威远县|