經過520、521的洗禮,我想我必須爲522做點什麼了,畢竟522也是傳說中的黑客情人節嘛。這裏想到了之前的一個段子,我再次從網上將原圖扒拉了出來。在這個傳說中的節日裏,能不能搞點事情?這麼長的圖看起來着實費力,能不能通過一定的手段將長圖分割,然後重組成動圖呢?這就是本文的目的……這裏解釋一下,因爲522那天小編家裏有急事,所以一直拖到今天才將這篇博客貼出來,沒關係,這也是一種缺憾美吧~
一、裁剪圖片
Python的PIL模塊是處理圖片的一大利器,我們可以使用Image.crop()對圖片進行裁剪。下面是圖片裁剪的方法:
def split_long_image(self):
'''
切分長圖並保存
:return:
'''
os.chdir(self.path) # 將工作目錄更改爲圖片的目錄路徑
try:
os.makedirs('images') # 新建目錄images
except FileExistsError: # 定義文件存在的異常
pass
width, height = self.image.size # 獲取文件的寬和高
__split_height = height / self.split_times # 獲取每次切分的高度
for image in range(self.split_times): # 獲取圖片並保存
# 劃定每張圖片的大小
__crop_box = (0, __split_height * image, width * 0.8, __split_height * (image + 1))
# 得到每張圖片
__per_picture = self.image.crop(__crop_box)
__picture_name = os.path.join(self.path, 'images', "image%d.png" % (image + 1))
self.pictures.append(__picture_name)
__per_picture.save(__picture_name)
通過以上方法對長圖進行切分,可以得到如下所示的多張圖片:
二、圖片合併成GIF動態圖
既然圖片已經切分完畢,那麼將切分的圖片合併成一個動態圖就顯的十分有必要了,以下是合併的方法:
def get_gif(self):
'''
靜圖轉換成動圖
:return:
'''
images = []
file = Image.open(self.pictures[0])
for image in self.pictures[1:]:
images.append(Image.open(image))
gif_name = os.path.join(self.path, "result.gif")
file.save(gif_name, save_all=True, loop=True, append_images=images, duration=self.change_time * 1000)
三、動態傳參
這裏爲了使程序有更強的複用性,選擇動態傳參的方法進行參數傳遞,這就涉及到了argparse庫,argparse是Python內置的一個用於命令項選項與參數解析的模塊,通過在程序中定義好我們需要的參數,argparse將會從sys.argv中解析出這些參數,並自動生成幫助和使用信息。其基本使用方法如下所示:
# 創建一個解析對象
parser = argparse.ArgumentParser()
# 向創建的解析對象中添加命令行參數和選項
parser.add_argument('-i', '--image_path', help="需要進行分割操作的圖片路徑")
parser.add_argument('-s', '--split_times', type=int, help="圖片分隔次數")
parser.add_argument('-c', '--change_time', type=float, help="GIF動圖切換時長")
# 解析
args = parser.parse_args()
四、運行程序
最後,就是整個代碼的測試環節了,命令行運行語句,得到結果如下所示:
python C://Users//Machenike//Desktop//SplitImagetoGif.py -i C://Users//Machenike//Desktop//image//hkqrj.jpg -s 16 -c 1
python C://Users//Machenike//Desktop//SplitImagetoGif.py -i C://Users//Machenike//Desktop//file//hkxdn.jpg -s 15 -c 1
怎麼樣?這個動圖看起來是不是比之前的長圖好多了?聰明的人都是選擇這樣過522的,哈哈哈~這時候大家就會存在一個疑惑,你所說的長圖到底是什麼樣的呢?別急,既然都到這裏了,那麼源碼奉上,原始長圖同樣奉上,請猛戳這裏~