在实际中可能常遇到这样的情况:有一些图片数据,但它们的扩展名不正常以至于不能正常显示,还有可能需要把图片格式统一下以方便文件管理。
举个栗子:
上面这些图片数据,很多是真正的图片,但是由于其扩展名不正常导致无法显示,这需要我们解析一下。我前两张数据做个示例,你看第一个数据文件的名称为:00a3bb57f00814a84ef88ac2e9e2dca0.png%21640x480,这里面就含有可能的正常图片的扩张名.png,如果去掉原始文件名后面的%21640x480,图片是不是就可以正常显示了啦,实际确实这样。第二个数据也是如此,具体见下图:
有了上面的有图有真相后,就可以写个代码解析和转化了:
#2019/12/11 by DQ
import os,cv2,shutil,re
def SparseInvalidExtNameIm():
def InvalidImExtName2ValidImExtName(FilePath, PsbImExtNames, NewDataDir): # 0.844827030247462.JPG
_, FileName = os.path.split(FilePath)
ObjIndexs = [Obj_span.start() for Obj_span in re.finditer('\.', FileName)]#查找.位置,必须是'\.'
for ObjIndex in ObjIndexs:
for PsbImExtName in PsbImExtNames:
try:
PsbExtName = FileName[ObjIndex:ObjIndex + len(PsbImExtName)]
except:
continue
if PsbExtName == PsbImExtName:
NewFileName = FileName[:ObjIndex] + PsbExtName
NewFilePath = os.path.join(NewDataDir, NewFileName)
try:
shutil.move(FilePath, NewFilePath)
print('{}--->{}'.format(FileName, NewDataDir))
break
except:
continue
def NoJpgIm2JpgIm(ImPath, NewImDir, InValidImDir):
_, ImName = os.path.split(ImPath)
if ImName.endswith('.jpg'):
shutil.copy(ImPath, NewImDir)
print('Copy {}--->{}'.format(ImPath, NewImDir))
else:
try:
Im = cv2.imread(ImPath)
except:
shutil.move(ImPath, InValidImDir)
print('Invalid {}--->{}'.format(ImPath, InValidImDir))
if Im is not None:
PureImName, _ = os.path.splitext(ImName)
NewImPath = os.path.join(NewImDir, PureImName + '.jpg')
cv2.imwrite(NewImPath, Im)
print('Write {}--->{}'.format(ImPath, NewImDir))
else:
shutil.move(ImPath, InValidImDir)
print('Invalid {}--->{}'.format(ImPath, InValidImDir))
PsbImExtNames = ('.jpg', '.JPG', '.jpeg', '.JPEG', '.png', '.PNG', '.bmp', '.BMP', '.gif', '.GIF')#可能的图片扩展名
DataMainDir = '/data/图片集合'
DataDir = os.path.join(DataMainDir, '非正常后缀名的图片')#非正常扩展名图片文件夹
NewDataDir = os.path.join(DataMainDir, '转化后的图片')#由于保存转化非正常扩展名图片后的图片
os.makedirs(NewDataDir, 0o777, True)
FileNames = os.listdir(DataDir)
for FileName in FileNames[:]:
FilePath = os.path.join(DataDir, FileName)
InvalidImExtName2ValidImExtName(FilePath, PsbImExtNames, NewDataDir)#先把扩展名恢复正常
NewImDir = os.path.join(DataMainDir, '转化后的图片_Valid')
os.makedirs(NewImDir, 0o777, True)
InValidImDir = os.path.join(DataMainDir, '转化后的图片_Invalid')
os.makedirs(InValidImDir, 0o777, True)
ImNames = os.listdir(NewDataDir)
for ImName in ImNames:
ImPath = os.path.join(NewDataDir, ImName)
NoJpgIm2JpgIm(ImPath, NewImDir, InValidImDir)#再把非jpg图片转化为jpg图片