如何使用代码去除水印以获得与输出图像相同的名称?
how to get the same name as an output image using a code to remove watermarks?
这是一个用于从图像中去除水印的代码,但我在某些图像中遇到一个简单的问题,即输出图像的名称在某些图像中缺少一个数字。这是代码:
#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。有人可以帮忙吗?
targetFile[0:targetFile.rfind('.')]
这就是问题所在。您试图切掉文件名最右边句点之后的所有内容,但如果文件名没有句点,rfind
returns -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
而不是自己连接目录名称也是一个好主意。您永远不知道什么时候您的代码会 运行 在对分隔符很挑剔的 OS 上。
rgb_im.save(os.path.join(outputDir, os.path.splitext(targetFile)[0] + outputFormat))
这是一个用于从图像中去除水印的代码,但我在某些图像中遇到一个简单的问题,即输出图像的名称在某些图像中缺少一个数字。这是代码:
#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。有人可以帮忙吗?
targetFile[0:targetFile.rfind('.')]
这就是问题所在。您试图切掉文件名最右边句点之后的所有内容,但如果文件名没有句点,rfind
returns -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
而不是自己连接目录名称也是一个好主意。您永远不知道什么时候您的代码会 运行 在对分隔符很挑剔的 OS 上。
rgb_im.save(os.path.join(outputDir, os.path.splitext(targetFile)[0] + outputFormat))