2011-12-01 16 views
17

मुझे पता है कि कोई .NET फ़ंक्शन नहीं है जो जांच के लिए मौजूद है, लेकिन क्या यह एक एल्गोरिदम है या बाइट सरणी का उपयोग करने से पहले एक बाइट वैध छवि है या नहीं, यह जांचने का आसान और प्रभावी तरीका है। मुझे इसकी आवश्यकता है क्योंकि मैं एक सर्वर पर अलग-अलग आदेश भेज रहा हूं जो लगातार क्लाइंट को सुन रहा है और कमांड में से एक सर्वर के कंप्यूटर का स्क्रीनशॉट प्राप्त करना है।कैसे जांचें कि एक बाइट सरणी वैध छवि है या नहीं?

+0

प्रत्येक छवि में एक निश्चित प्रारूप में एक शीर्षलेख होता है। आप हमेशा यह जांच सकते हैं। –

उत्तर

27

आप बाइट सरणी से एक छवि उत्पन्न करने का प्रयास कर सकते हैं और ArgumentException की जांच कर सकते हैं यदि यह नहीं है।

public static bool IsValidImage(byte[] bytes) 
{ 
    try { 
     using(MemoryStream ms = new MemoryStream(bytes)) 
      Image.FromStream(ms); 
    } 
    catch (ArgumentException) { 
     return false; 
    } 
    return true; 
} 
+8

मुझे नहीं लगता कि यह "बाइट सरणी का उपयोग करने से पहले जांच कर रहा है" –

8

जैसा कि ध्यान दिया गया है, इसे किसी छवि में लोड करने का प्रयास करना एकमात्र असफल-सुरक्षित तरीका है। आप [अपेक्षित] छवि प्रकार के आधार पर मैजिक नंबर उर्फ ​​फ़ाइल शीर्षलेख देख सकते हैं। उदाहरण के लिए, एक * .PNG फ़ाइल के पहले 8 ओक्टेट्स हेक्स में, कर रहे हैं:

0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

छवि फ़ाइलों के अधिकांश अन्य प्रकार के समान जादुई करिश्मों नंबर हैं।

लेकिन यह जांचना वास्तव में आपको नहीं बताएगा कि फ़ाइल वैध छवि फ़ाइल है या नहीं। इसके बाद आपको पता चलेगा कि मैजिक नंबर इंगित करता है कि इसकी एक प्रकार की फाइल एक्स है। इसे अभी भी छोटा कर दिया जा सकता है या अन्यथा दूषित हो सकता है, या यहां तक ​​कि कुछ और भी पूरी तरह से हो सकता है जो कि ऑक्टेट्स का सही अनुक्रम होता है सही जगह।

2

एक जेपीईजी के लिए आप जांच सकते हैं कि पहले दो बाइट 0xFF, 0xD8 हैं और अंतिम दो 0xFF, 0xD9 हैं। बेशक यह अभी भी संभव है कि छवि डेटा ईओआई टैग से मेल खाएगा, लेकिन यह दुर्लभ होना चाहिए।

-1

मेरे हिसाब से, यदि आप केवल छवि इनपुट (उचित छवि) चाहते हैं, तो आप इस तरह इनपुट क्षेत्र की विशेषता को स्वीकार के साथ जाना चाहिए:

इनपुट प्रकार = "फाइल" नाम = "uploadedFile" id = " imageContent "class =" required "accept =" image/* "/>

यह आपको इनपुट में केवल छवियां देगा। तो, आप बैकएंड के लिए स्वतंत्र रूप से कोड कर सकते हैं। छवि के बारे में चिंता किए बिना मान्य है या नहीं।

और अगर आप की तरह चाहते हैं यहां तक ​​कि आप विशिष्ट छवि के प्रकार का उल्लेख कर सकते हैं:

इनपुट प्रकार = "फाइल" नाम = "uploadedFile" id = "imageContent" class = "आवश्यक" स्वीकार = "image/jpeg, छवि/gif, image/png ">

+0

यह मानता है कि उपयोगकर्ता एक गैर-दुर्भावनापूर्ण उपयोगकर्ता है, ब्राउज़र सही ढंग से इन विशेषताओं का सही ढंग से समर्थन करता है, और कुछ अन्य चीजों पर विचार करने के लिए। हमेशा जितना संभव हो सके अपने बैक-एंड को सुरक्षित करें, क्योंकि क्लाइंट-साइड सत्यापन, दुख की बात है, अविश्वसनीय है। –

संबंधित मुद्दे