如何使用代码删除水印来获取与输出图像相同的名称?

时间:2017-02-15 15:08:00

标签: python python-imaging-library

这是用于从图像中删除水印的代码,但我在某些图像中有一个简单的问题,即输出图像的名称在某些图像中缺少数字。这是代码:

#coding:utf-8
import os
import os.path
from PIL import Image


outputFormat = '.png'

def hasBlackAround(x, y, distance, img):
    w, h = img.size
    startX = 0 if x - distance < 0 else x - distance
    startY = 0 if y - distance < 0 else y - distance
    endX = w - 1 if x + distance > w - 1 else x + distance
    endY = h - 1 if y + distance > h - 1 else y + distance
    hasBlackAround = False
    for j in range(startX, endX):
        for k in range(startY, endY):
            r, g, b = img.getpixel((j, k))
            if r < 130 and g < 130 and b < 130:
                return True
    return False

currentPath = os.getcwd()
fileList = os.listdir(currentPath)
for file in fileList:
    if(os.path.isdir(file)):
        targetFiles = os.listdir(file)
        outputDir = file + '/output/'
        if not os.path.isdir(outputDir):
            os.makedirs(outputDir)
        for targetFile in targetFiles:
            try:
                img = Image.open(file + '/' + targetFile)
                w, h = img.size
                rgb_im = img.convert('RGB')
                for x in range(0, w - 1):
                    for y in range(0, h - 1):
                        if not hasBlackAround(x, y, 1, rgb_im):
                            rgb_im.putpixel((x, y), (255, 255, 255))
                rgb_im.save(outputDir + targetFile[0:targetFile.rfind('.')] + outputFormat)
            except IOError:
                print targetFile + ' is not a image file'
            except  Exception as e:
                print e
print 'Done'

示例图像名称:11A087 输出图像名称:11A08.png

我需要输出为11A087.png。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

targetFile[0:targetFile.rfind('.')]

这就是问题所在。您试图切断文件名最右边的所有内容,但如果文件名没有句点,则rfind会返回-1并将最后一个字母切掉。更简单的例子:

>>> targetFile = "foobar.png"
>>> targetFile[0:targetFile.rfind(".")]
'foobar'
>>> targetFile = "bazqux"
>>> targetFile[0:targetFile.rfind(".")]
'bazqu'

尝试使用os.path.splitext而不是自己切片。它的存在就是为了这个目的。

>>> import os
>>> targetFile = "foobar.png"
>>> os.path.splitext(targetFile)[0]
'foobar'
>>> targetFile = "bazqux"
>>> os.path.splitext(targetFile)[0]
'bazqux'

使用os.path.join而不是自己连接目录名称也是个好主意。你永远不知道什么时候你的代码将在一个对分隔符字符挑剔的操作系统上运行。

rgb_im.save(os.path.join(outputDir, os.path.splitext(targetFile)[0] + outputFormat))