這樣的一張圖片,用普通的等寬來切割:
def sliceImg( img, outDir, count = 4):
w, h = img. size
eachWidth = int( w / count)
for i in range( count):
box = ( i * eachWidth, 0, ( i + 1) * eachWidth, h)
img. crop( box). save( outDir + str( i) + ".png")
可以看到切割效果很差,3都要切成8了。
我們可以換種思想,在目標位置的前後進行垂直上的像素判斷,判斷某一列的黑色像素最少,就是切割點。代碼改成:
def smartSliceImg( img, outDir, count = 4, p_w = 3):
'''
:param img:
:param outDir:
:param count: 圖片中有多少個圖片
:param p_w: 對切割地方多少像素內進行判斷
:return:
'''
w, h = img. size
pixdata = img. load()
eachWidth = int( w / count)
beforeX = 0
for i in range( count):
allBCount = []
nextXOri = ( i + 1) * eachWidth
for x in range( nextXOri - p_w, nextXOri + p_w):
if x >= w:
x = w - 1
if x < 0:
x = 0
b_count = 0
for y in range( h):
if pixdata[ x, y] == 0:
b_count += 1
allBCount. append({ 'x_pos': x, 'count': b_count})
sort = sorted( allBCount, key = lambda e: e. get( 'count'))
nextX = sort[ 0][ 'x_pos']
box = ( beforeX, 0, nextX, h)
img. crop( box). save( outDir + str( i) + ".png")
beforeX = nextX
可以看到切割效果好多了,但是這種還是無法處理斜著的情況。
http://www.waitingfy.com/archives/3778