图片非正常扩展名解析转化和转化为jpg格式

       在实际中可能常遇到这样的情况:有一些图片数据,但它们的扩展名不正常以至于不能正常显示,还有可能需要把图片格式统一下以方便文件管理。

       举个栗子:

上面这些图片数据,很多是真正的图片,但是由于其扩展名不正常导致无法显示,这需要我们解析一下。我前两张数据做个示例,你看第一个数据文件的名称为: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图片

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值