কোনও ফাইল বৈধ চিত্রের ফাইল কিনা তা কীভাবে পরীক্ষা করবেন?


105

আমি বর্তমানে পিআইএল ব্যবহার করছি।

from PIL import Image
try:
    im=Image.open(filename)
    # do stuff
except IOError:
    # filename not an image file

তবে এটি বেশিরভাগ ক্ষেত্রে যথেষ্ট পরিমাণে কভার করে, কিছু চিত্র ফাইল যেমন, এক্সসিএফ, এসভিজি এবং পিএসডি সনাক্ত করা যায়নি। পিএসডি ফাইলগুলি একটি ওভারফ্লোআরর ব্যতিক্রম ছুঁড়ে।

আমি কি তাদেরকেও অন্তর্ভুক্ত করতে পারি?


21
বিশেষত বিভিন্ন ভাষায় নকল বন্ধ করা সাধারণ অভ্যাস নয়। যদি আপনি পাইথন সম্পর্কিত কোনও প্রশ্ন না খুঁজে পান তবে এটি উন্মুক্ত ছেড়ে দিন কারণ পাইথন-নির্দিষ্ট সমাধান থাকতে পারে যা লোকেরা পোস্ট করতে চায় যা এটি আপনার পোস্ট করা প্রশ্নটিতে আসে না।
পাওলো বার্গান্টিনো

হ্যাঁ, সবার আগে আমি সত্যিই একটি অজগর পাখির জন্য আশা করছিলাম যা সম্পর্কে আমি জানতাম না: পি এবং তারপরে বেন হিসাবে উল্লেখ করা হয়েছে, কেবল যাদু সংখ্যাগুলি পুরো চিত্রটিকে বৈধতা দেয় না।
সুজয়

@ সুজয়, একটি সম্পূর্ণ চিত্র যাচাই করা প্রায় অসম্ভব, যদি না আপনার কাছে এর একটি অনুলিপি থাকে তবে কম্পিউটার যতক্ষণ না সমস্ত নিয়ন্ত্রণ নিয়ন্ত্রণ না করে, একটি সঠিক রঙের পিক্সেল এবং 1s এবং 0 এর সেটযুক্ত সেটগুলির মধ্যে পার্থক্য বলতে পারে না unless (ম্যাজিক সংখ্যা) সঠিক।
ডেভিনিবি

@ দেবিনব, একমত হয়েছেন, আমি কেবল যাদু নম্বরগুলি পেয়েছি এবং এটি সম্পন্ন করব যদি না অন্য কেউ রিফ্যাক্টরের জন্য কল করার জন্য আরও ভাল কিছু উপস্থিত না করে :)
সুজয়

এক্সসিএফ এবং পিএসডি আসলে চিত্র নয়, এগুলি এমন প্রকল্পের ফাইল যা (প্রায়শই অনেকগুলি) চিত্র থাকে ... আপনি সম্ভবত এসজিজি-র ক্ষেত্রে একটি মামলা করতে পারেন।
মগলগগুলি

উত্তর:


11

অনেক বার প্রথম দম্পতি চরিত্রগুলি বিভিন্ন ফাইল ফর্ম্যাটগুলির জন্য একটি যাদু নম্বর হবে। উপরে আপনি ব্যতিক্রম ছাড়াও এটি পরীক্ষা করতে পারেন।


10
তিনি যদি সত্যিই "বৈধ" চিত্রগুলির জন্য পরীক্ষা করেন তবে এটি যথেষ্ট হবে না; ম্যাজিক সংখ্যার উপস্থিতি গ্যারান্টি দেয় না যে ফাইলটি কাটা হয়নি।
বেন ফাঁকা 18

1
চমৎকার পরামর্শ, এখন আমি কেবল এই সংখ্যাগুলি কী তা নির্ধারণ করতে হবে। ধন্যবাদ :)
সুজয়

@ বেন, আচ্ছা আমি এখনও এটি সম্পর্কে ভাবিনি। প্রকৃতপক্ষে একটি ভাল বক্তব্য রয়েছে
সুজয়

@ বেন, আপনি কীভাবে আশা করবেন যে কোনও লাইব্রেরি কোনও ফাইল কেটে ফেলা হবে তা ছেঁটে ফেলা হয়েছে?
ডেভিনিবি

6
@ বেন ব্ল্যাঙ্ক: সত্য, তবে সমস্যার সমাধান করা 99% উপায় প্রায়শই ভাল হয় তবে তা সমাধান না করেই হয়।
ব্রায়ান আর। বন্ডি

205

আমি সবেমাত্র বিল্টিন ইমগডিআর মডিউলটি পেয়েছি । পাইথন ডকুমেন্টেশন থেকে:

Imgdr মডিউল কোনও ফাইল বা বাইট স্ট্রিমের মধ্যে থাকা চিত্রের ধরণ নির্ধারণ করে।

এটা এভাবে কাজ করে:

>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'

অনুরূপ কার্যকারিতা সংশোধন করার চেয়ে মডিউল ব্যবহার করা অনেক ভাল


2
হ্যাঁ imghdr বেশিরভাগ চিত্রের ফর্ম্যাটের জন্য কাজ করে তবে সমস্ত নয়। আমার এসজিজি, এক্সসিএফ এবং পিএসডি ফাইলগুলির সাথে আমার মূল সমস্যাটি হিসাবে ভাল, সেগুলিও imgdr তেও সনাক্ত করা যায় না
সুজয়

2
আপনার উত্তর আসলে ভাল, ধন্যবাদ। উপরের কেউ যেমন বলেছিল ... তবে সমস্যাটির 99% উপায় সমাধান করা প্রায়শই ভাল হয় তবে একেবারেই সমাধান না করে ..
রিঙ্ককিপিংক

2
লক্ষ্যণীয় মূল্য: প্রদত্ত চিত্রগুলি প্রদান করা না হলে প্রদানগুলি imghdr.what(path)প্রত্যাবর্তন করে returns তালিকা : বর্তমানে স্বীকৃত ইমেজ ধরনের RGB , GIF , PBM , PGM , পিপিএম , এক চুমুক মদ , rast , xbm , JPEG , BMP , PNG , webp , exrNonepath
patryk.beza

1
সতর্ক হোন! একটি বৈধ এইচডিআর মানে একটি বৈধ চিত্র নয় (উদাহরণস্বরূপ চিত্রের বাইটগুলি স্ক্র্যাম্বল করা হয়ে থাকতে পারে!)
ফিলিপো মজজা

1
ফিলিপোমাজার মন্তব্য অনুসারে, আমি নিশ্চিত করতে পারি যে স্থানান্তরকালে একটি খারাপ চিত্র যে পরীক্ষা থেকে কেটে গেছে তা এই পরীক্ষায় উত্তীর্ণ হতে পারে, তবে পিআইএল এটি পড়ার চেষ্টা করলে তা ভেঙে যাবে।
কেভিনমাইক

47

ব্রায়ান যা পরামর্শ দিচ্ছে তা ছাড়াও আপনি পিআইএল এর যাচাই পদ্ধতিটি ফাইলটি নষ্ট কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন ।

im.verify ()

চিত্রের ডেটা ডিকোডিং না করেই ফাইলটি নষ্ট হয়েছে কিনা তা নির্ধারণের চেষ্টা করা হচ্ছে। যদি এই পদ্ধতিতে কোনও সমস্যা দেখা দেয় তবে এটি উপযুক্ত ব্যতিক্রমগুলি উত্থাপন করে। এই পদ্ধতিটি কেবলমাত্র নতুন খোলা চিত্রটিতে কাজ করে; ইমেজটি ইতিমধ্যে লোড করা থাকলে, ফলাফলটি অনির্ধারিত। এছাড়াও, এই পদ্ধতিটি ব্যবহার করার পরে আপনার যদি চিত্রটি লোড করতে হয়, আপনাকে অবশ্যই চিত্র ফাইলটি আবার খুলতে হবে। আরোপ করা


তবে মূল সমস্যাটি হ'ল এসভিজি, এক্সসিএফ এবং পিএসডি ফাইলগুলি ইমেজ.ওপেন () দিয়ে খোলা যাবে না, তাই im.verify () দিয়ে যাচাইয়ের কোনও সুযোগ নেই
সুজয়

16
আমার godশ্বর পিআইএল ডকুমেন্টেশন ভয়ানক। "উপযুক্ত ব্যতিক্রম" ঠিক কী?
টিম্ম্ম্ম

ইমেজ.ভেরিফাই () এর জন্য বালিশ ডকুমেন্টেশনের লিঙ্কটি এখানে । দুর্ভাগ্যক্রমে, এটি এর চেয়ে ভাল নয় এবং দেখে মনে হচ্ছে যে তারা কিছু যোগ না করে উপরের অনুচ্ছেদটি সরিয়ে নিয়েছে।
টু-বিট অ্যালকেমিস্ট

আমি দুর্নীতিগ্রস্থ png ফাইলগুলির জন্য সিনট্যাক্স এয়ারের উত্থাপন যাচাই করে দেখেছি
কার্ল

"সত্যই চিত্রের ডিকোডিংটি দিয়ে" যাচাই করার কোনও উপায় আছে?
ট্রেভর বয়ড স্মিথ

7

থেকে উপরন্তু PILচেক চিত্র এছাড়াও আপনি এই মত ফাইলের নাম এক্সটেনশন চেক যুক্ত করতে পারেন:

filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))

দ্রষ্টব্য যে কেবলমাত্র ফাইলের নামটিতে বৈধ চিত্রের এক্সটেনশন রয়েছে কিনা তা যাচাই করে, এটি কোনও বৈধ চিত্র কিনা তা দেখার জন্য এটি চিত্রটি খোলেন না, এজন্য আপনাকে অতিরিক্ত PILবা অন্য উত্তরগুলিতে প্রস্তাবিত লাইব্রেরিগুলির একটিও ব্যবহার করতে হবে ।


এক্সটেনশনগুলি ফাইলগুলিতে ভুল হলে কী হবে? উদাহরণস্বরূপ, একটি পাঠ্য ফাইল .jpg এক্সটেনশন বা তদ্বিপরীত দিয়ে সংরক্ষণ করা হয়।
hafiz031

1
@ হাফিজ031 আসল ফর্ম্যাটটি পেতে আপনি যা করতে পারেন from PIL import Image img = Image.open(filename) print(img.format)এবং তারপরে এটি যাচাই করে দেখুন:img.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
tsveti_iko

দুর্ভাগ্যক্রমে এটি আমার পক্ষে কার্যকর হয়নি। এটি এখনও দুর্নীতিগ্রস্থ চিত্রটিকে জেপিইজি চিত্র হিসাবে চিহ্নিত করছে। : অবশেষে আমি এই ভাবে এই ক্ষেত্রে (আমি OpenCv ব্যবহার করছি) হ্যান্ডেল পরিচালিত stackoverflow.com/a/63421847/6907424
hafiz031

6

হালনাগাদ

আমি আমার পাইথন স্ক্রিপ্টে নিম্নলিখিত সমাধানটি এখানে গিটহাবটিতেও প্রয়োগ করেছি

আমি এটিও যাচাই করেছিলাম যে ক্ষতিগ্রস্থ ফাইলগুলি (জেপিজি) প্রায়শই 'ভাঙা' চিত্র নয়, অর্থাত্ কোনও ক্ষতিগ্রস্থ চিত্র ফাইলটি কখনও কখনও একটি লাইট চিত্র ফাইল হিসাবে থাকে, মূল চিত্রটি হারিয়ে যায় বা পরিবর্তিত হয় তবে আপনি এখনও কোনও ত্রুটি ছাড়াই এটি লোড করতে সক্ষম হন। তবে, ফাইল কেটে ফেলার কারণে সর্বদা ত্রুটি হয়।

শেষ আপডেট

আপনি পাইথন বালিশ ব্যবহার করতে পারেনকোনও ফাইল বৈধ এবং অক্ষত চিত্র ফাইল কিনা তা পরীক্ষা করতে আপনি বেশিরভাগ চিত্র ফর্ম্যাট সহ (পিআইএল) মডিউলটি ।

আপনার ভাঙা চিত্রগুলি সনাক্ত করার লক্ষ্যে, @ নদিয়া আলরামলি সঠিকভাবে 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 এমবিাইট / সেকেন্ডে বালিশ-সিমডি মডিউল (আধুনিক 2.5 গিগাহার্টজ x86_64 সিপিইউ) সহ 40 এমবিাইট / সেকেন্ড সহ চিত্রের একটি সেট যাচাই করতে যাচ্ছেন।

অন্যান্য ফরম্যাটের জন্য পিএসডি , xcf , .. আপনি ব্যবহার করতে পারেন ImageMagick মোড়কের ওয়ান্ড , কোড নিম্নরূপ হয়:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

তবে, আমার পরীক্ষাগুলি থেকে ওয়ান্ড কাটা চিত্রগুলি সনাক্ত করতে পারে না, আমি মনে করি এটি বিনা প্ররোচনা ছাড়াই গ্রেড অঞ্চল হিসাবে অভাবযুক্ত অংশগুলি লোড করে।

আমি লাল করেছিলাম যে ইমেজম্যাগিকের একটি বহিরাগত কমান্ড রয়েছে যা কাজটি করতে পারে তা সনাক্ত করতে পারে , তবে আমি প্রোগ্রামটিভাবে সেই ফাংশনটি চালানোর কোনও উপায় খুঁজে পাইনি এবং আমি এই রুটটি পরীক্ষা করি নি।

আমি সর্বদা প্রাথমিক চেক করার পরামর্শ দিই, ফাইলসাইজটি শূন্য (বা খুব ছোট) না হওয়ার জন্য পরীক্ষা করুন , খুব সস্তা ধারণা:

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case

4

লিনাক্সে, আপনি পাইথন-যাদু ব্যবহার করতে পারেন ( http://pypi.python.org/pypi/python-magic/0.1 ) যা ফাইল ফর্ম্যাটগুলি সনাক্ত করতে লিবম্যাগিক ব্যবহার করে।

আফাইক, লিবম্যাগিক ফাইলটিতে নজর রাখে এবং বিটম্যাপের মাত্রা, ফর্ম্যাট সংস্করণ ইত্যাদির মতো আপনাকে বিন্যাসের চেয়ে আরও বেশি কিছু বলার চেষ্টা করে। সুতরাং আপনি এটিকে "বৈধতা" এর জন্য একটি পৃষ্ঠের পরীক্ষা হিসাবে দেখতে পাবেন।

"বৈধ" এর অন্যান্য সংজ্ঞাগুলির জন্য আপনাকে নিজের পরীক্ষা লিখতে হতে পারে।


4

আপনি পাইথন বাইন্ডিংগুলি লাইবমেজিক, পাইথন-ম্যাজিক এবং তারপর মাইমের প্রকারগুলি পরীক্ষা করতে ব্যবহার করতে পারেন । ফাইলগুলি দূষিত বা অক্ষত রয়েছে কিনা তা আপনাকে জানায় না তবে এটি কী ধরণের চিত্র তা নির্ধারণ করতে সক্ষম হওয়া উচিত।


3

ঠিক আছে, আমি পিএসডি-র অন্তর্দৃষ্টিগুলি সম্পর্কে জানি না, তবে আমি নিশ্চিতভাবেই জানি যে সত্য হিসাবে, এসভিজি প্রতি সেমে কোনও চিত্র ফাইল নয় - এটি এক্সএমএল উপর ভিত্তি করে, তাই এটি মূলত একটি সরল পাঠ্য ফাইল


আহা, আপনি ঠিক বলেছেন। এটি এক্সএমএল। তবে এটিতে এমবেড করা কিছু চিত্র ডেটা রয়েছে।
সুজয়

2

একটি বিকল্প ব্যবহার করা হয় filetype প্যাকেজ ।

স্থাপন

python -m pip install filetype

সুবিধাদি

  1. দ্রুত: এটি আপনার চিত্রের প্রথম কয়েকটি বাইট লোড করে কাজ করে ( ম্যাজিক নম্বরটি দেখুন) )
  2. বিভিন্ন মাইম প্রকার সমর্থন করে: চিত্র, ভিডিও, ফন্ট, অডিও, সংরক্ষণাগার।

সমাধান উদাহরণ

import filetype

filename = "/path/to/file.jpg"

if filetype.image(filename):
    print(f"{filename} is a valid image...")
elif filetype.video(filename):
    print(f"{filename} is a valid video...")

অফিসিয়াল রেপো সম্পর্কিত অতিরিক্ত তথ্য: https://github.com/h2non/filetype.py


1

ফাইল এক্সটেনশনগুলি চেক করা গ্রহণযোগ্য হবে বা আপনি নিজেই কোনও চিত্র ফাইলের প্রতিনিধিত্ব করে এমন ডেটা নিশ্চিত করার চেষ্টা করছেন?

আপনি যদি ফাইল এক্সটেনশানটি পরীক্ষা করতে পারেন তবে একটি নিয়মিত এক্সপ্রেশন বা একটি সাধারণ তুলনা প্রয়োজনীয়তা পূরণ করতে পারে।


কেবল এক্সটেনশানটি পরীক্ষা করা যথেষ্ট নয়, যেহেতু কেউ কোনও টেক্সট ফাইলটির নাম জেপিজি বা অন্য কিছু হিসাবে রাখতে পারে। আমার ধারণা, আমি যদি কোনও সমাধান না পাই তবেই আমি এক্সসিএফ এবং এসভিজি-র জন্য এক্সটেনশন চেকিং ব্যবহার করব
সুজয়

বোধগম্য, আমি এমন একটি সমাধান প্রস্তুত করার আগে আমি আরও কিছু স্পষ্টতার জন্য আশা করছিলাম যা আপনার প্রয়োজনের সাথে আরও ভাল মানায়। ধন্যবাদ!
ডুমস্পর্ক

-1
format = [".jpg",".png",".jpeg"]
 for (path,dirs,files) in os.walk(path):
     for file in files:
         if file.endswith(tuple(format)):
             print(path)
             print ("Valid",file)
         else:
             print(path)
             print("InValid",file)

আপনার কোডে কিছু ইনডেন্টেশন সমস্যা রয়েছে এবং এটি সঠিকভাবে চলবে না। এছাড়াও, আপনার কোড কেন এবং কীভাবে সমস্যা সমাধান করে সে সম্পর্কে কিছু ব্যাখ্যা যুক্ত করার বিষয়ে বিবেচনা করুন। কোড-কেবলমাত্র উত্তরগুলি ভবিষ্যতের পাঠকদের জন্য এখানে আসার পক্ষে তেমন সহায়ক হবে না।
টমেরিকু

এখানে আমরা Agrparser পদ্ধতি ব্যবহার করেছি।
rObinradOO
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.