อัปเดต
ฉันยังดำเนินการแก้ปัญหาต่อไปนี้ในสคริปต์ Python ของฉันที่นี่ใน GitHub
ฉันยังตรวจสอบด้วยว่าไฟล์ที่เสียหาย (jpg) มักไม่ใช่ภาพที่ 'เสีย' เช่นไฟล์รูปภาพที่เสียหายบางครั้งยังคงเป็นไฟล์รูปภาพที่ถูกต้องรูปภาพต้นฉบับสูญหายหรือมีการเปลี่ยนแปลง แต่คุณยังสามารถโหลดได้โดยไม่มีข้อผิดพลาด แต่การตัดไฟล์ทำให้เกิดข้อผิดพลาดเสมอ
สิ้นสุดการอัปเดต
คุณสามารถใช้โมดูลPython Pillow (PIL) กับรูปแบบรูปภาพส่วนใหญ่เพื่อตรวจสอบว่าไฟล์นั้นเป็นไฟล์รูปภาพที่ถูกต้องหรือไม่
ในกรณีที่คุณมุ่งเป้าไปที่การตรวจจับภาพที่แตกเช่นกัน @Nadia Alramli แนะนำim.verify()
วิธีการนี้อย่างถูกต้องแต่ไม่พบข้อบกพร่องของภาพที่เป็นไปได้ทั้งหมดเช่นim.verify
ตรวจไม่พบภาพที่ถูกตัดทอน (ซึ่งผู้ชมส่วนใหญ่มักจะโหลดด้วยพื้นที่สีเทา)
หมอนสามารถตรวจจับข้อบกพร่องประเภทนี้ได้เช่นกัน แต่คุณต้องใช้การปรับแต่งภาพหรือการถอดรหัส / การเข้ารหัสภาพหรือเพื่อเรียกใช้การตรวจสอบ สุดท้ายฉันขอแนะนำให้ใช้รหัสนี้:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
ในกรณีที่ภาพมีข้อบกพร่องรหัสนี้จะยกข้อยกเว้น โปรดพิจารณาว่า im.verify เร็วกว่าการปรับแต่งภาพประมาณ 100 เท่า (และฉันคิดว่าการพลิกเป็นหนึ่งในการแปลงที่ถูกกว่า) ด้วยรหัสนี้คุณจะตรวจสอบชุดภาพที่ความเร็วประมาณ 10 MBytes / วินาทีด้วย Pillow มาตรฐานหรือ 40 MBytes / วินาทีพร้อมโมดูล Pillow-SIMD (CPU 2.5Ghz x86_64 ที่ทันสมัย)
สำหรับรูปแบบอื่น ๆpsd , xcf , .. คุณสามารถใช้Imagemagick wrapper Wandรหัสจะเป็นดังนี้:
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
แต่จากการทดลองของฉัน Wand ตรวจไม่พบภาพที่ถูกตัดทอนฉันคิดว่ามันโหลดส่วนที่ขาดเป็นพื้นที่สีเทาโดยไม่ต้องแจ้ง
ฉันขอแดงว่าImagemagickมีคำสั่งภายนอกที่ระบุว่าสามารถทำให้งานได้ แต่ฉันไม่พบวิธีเรียกใช้ฟังก์ชันนั้นโดยใช้โปรแกรมและฉันไม่ได้ทดสอบเส้นทางนี้
ฉันขอแนะนำให้ทำการตรวจสอบเบื้องต้นเสมอตรวจสอบขนาดไฟล์ไม่ให้เป็นศูนย์ (หรือเล็กมาก) เป็นแนวคิดที่ถูกมาก:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case