2009-12-15 83 views
7

如何切斷PNG圖像的空白邊框區域並使用Python將其縮小到最小尺寸?將PNG圖像裁剪爲最小尺寸

+0

邊界區域大小是否爲靜態?如果是這樣,你可以嘗試使用ImageMagick python綁定。 – Qberticus 2009-12-15 06:03:38

+0

空白邊框大小不是固定值,它每個圖像都不相同。 – jack 2009-12-15 06:06:27

回答

13

PILgetbbox爲我工作

im.getbbox()=> 4元組或無

計算圖像中的 非零區域的邊界框。邊界框返回爲4元組 ,定義左下角像素座標,右上角像素座標和右下角像素座標。如果圖像 完全爲空,則此方法 將返回無。

代碼示例,我試過了,我用bmp進行了測試,但它也適用於png。

>>> import Image 
>>> im=Image.open("test.bmp") 
>>> im.size 
(364, 471) 
>>> im.getbbox() 
(64, 89, 278, 267) 
>>> im2=im.crop(im.getbbox()) 
>>> im2.size 
(214, 178) 
>>> im2.save("test2.bmp") 
1

您可以使用PIL查找純粹由您的邊框顏色組成的圖像的行和列。

使用此信息,您可以輕鬆確定鑲嵌圖像的範圍。

PIL再次將允許您裁剪圖像以刪除邊框。

3

https://gist.github.com/3141140

import Image 
import sys 
import glob 

# Trim all png images with alpha in a folder 
# Usage "python PNGAlphaTrim.py ../someFolder" 

try: 
    folderName = sys.argv[1] 
except : 
    print "Usage: python PNGPNGAlphaTrim.py ../someFolder" 
    sys.exit(1) 

filePaths = glob.glob(folderName + "/*.png") #search for all png images in the folder 

for filePath in filePaths: 
    image=Image.open(filePath) 
    image.load() 

    imageSize = image.size 
    imageBox = image.getbbox() 

    imageComponents = image.split() 

    if len(imageComponents) < 4: continue #don't process images without alpha 

    rgbImage = Image.new("RGB", imageSize, (0,0,0)) 
    rgbImage.paste(image, mask=imageComponents[3]) 
    croppedBox = rgbImage.getbbox() 

    if imageBox != croppedBox: 
     cropped=image.crop(croppedBox) 
     print filePath, "Size:", imageSize, "New Size:",croppedBox 
     cropped.save(filePath) 
0

我認爲這是必要的,以補充@Frank克魯格的答案。他提出了一個很好的觀點,但它不包括如何從圖像中正確地裁剪額外的邊框顏色。我發現here。具體來說,我發現這有用:

from PIL import Image, ImageChops 

def trim(im): 
    bg = Image.new(im.mode, im.size, im.getpixel((0,0))) 
    diff = ImageChops.difference(im, bg) 
    diff = ImageChops.add(diff, diff, 2.0, -100) 
    bbox = diff.getbbox() 
    if bbox: 
     return im.crop(bbox) 

im = Image.open("bord3.jpg") 
im = trim(im) 
im.show() 
+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的基本部分並提供參考鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/11453172) – niton 2016-02-29 21:55:00

+0

修改爲包含特定的代碼。好點子。 – AaronJPung 2016-02-29 21:56:54

2

我今天有同樣的問題。這是我的解決方案來裁剪透明邊框。只需將此腳本與您的批處理.png文件一起放入您的文件夾:

from PIL import Image 
import numpy as np 
from os import listdir 

def crop(png_image_name): 
    pil_image = Image.open(png_image_name) 
    np_array = np.array(pil_image) 
    blank_px = [255, 255, 255, 0] 
    mask = np_array != blank_px 
    coords = np.argwhere(mask) 
    x0, y0, z0 = coords.min(axis=0) 
    x1, y1, z1 = coords.max(axis=0) + 1 
    cropped_box = np_array[x0:x1, y0:y1, z0:z1] 
    pil_image = Image.fromarray(cropped_box, 'RGBA') 
    print(pil_image.width, pil_image.height) 
    pil_image.save(png_image_name) 
    print(png_image_name) 

for f in listdir('.'): 
    if f.endswith('.png'): 
     crop(f)