2017-02-15 22 views
-1

Это код для удаления водяных знаков с изображений, но у меня есть простая проблема на некоторых изображениях, которые являются именем выходного изображения, не хватает цифры на некоторых изображениях. Это код:как получить то же имя, что и выходное изображение, используя код для удаления водяных знаков?

#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
targetFile[0:targetFile.rfind('.')] 

В этом проблема. Вы пытаетесь отрезать все, что осталось от самого правого периода имени файла, но если имя файла не имеет периода, rfind возвращает -1, и он отделяет последнюю букву. Simpler пример:

>>> 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)) 
+0

спасибо. все мои изображения - это просто имена без расширений, поэтому я просто передал целевой образ без нарезки, и он сработал. –