2012-10-02 13 views
6

में खाली है या नहीं, मैंने हर जगह देखा है, लेकिन यह देखने के लिए कि कोई छवि खाली है या नहीं, यह एक मानक (मैं देख सकता हूं) नहीं लगता है। सी #यह देखने के लिए जांच कर रहा है कि कोई छवि C#

मेरे पास ऐसा करने का एक तरीका है, लेकिन यह जानना अच्छा होगा कि कोई छवि खाली है या नहीं, इसलिए भविष्य में हर कोई भी जान सकता है।

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

आप एक .jpg छवि लेते हैं, इसकी चौड़ाई प्राप्त करें। उदाहरण के लिए 500 पिक्सेल तो फिर तुम कि 2 आप 250

देकर तो फिर तुम जाँच क्या हर पिक्सेल के रंग के स्थान में है (250 चौड़ाई, और मैं ऊंचाई) (जहां पुनरावृति के hight सोचा विभाजित छवि

यह तब होता है जो केवल छवि के पिक्सेल की मध्य रेखा को लंबवत रूप से जांचता है। हालांकि यह सभी पिक्सल यह देखने के लिए जांच कर रहा है कि रंग कुछ भी सफेद है या नहीं। मैंने ऐसा किया है ताकि आपके पास ऐसा न हो सभी 500 * पिक्सेल की ऊंचाई को खोजने के लिए और चूंकि आप लगभग हमेशा पृष्ठ के मध्य में एक रंग भरेंगे।

यह काम कर रहा है ... थोड़ा धीमा होना चाहिए ... वहां होना चाहिए ऐसा करने का बेहतर तरीका? आप उस पृष्ठ को स्पॉट करने का मौका बढ़ाने के लिए लंबवत रूप से 2/3/4 लाइनों को खोजने के लिए इसे बदल सकते हैं जो रिक्त नहीं है, लेकिन इसमें और भी समय लगेगा।

(यह भी ध्यान रखें, अगर यह कुछ इस मामले में काम नहीं करेगा शामिल हैं जाँच करने के लिए छवि का आकार का उपयोग करते हुए, के बाद से एक रिक्त पृष्ठ के आकार पर दो वाक्यों और के साथ एक पृष्ठ भी एक दूसरे के करीब है)

समाधान के बाद जोड़ा गया है।

समाधान के कार्यान्वयन और समझ में सहायता के लिए संसाधन। सिर्फ उल्लेख के छोटे त्रुटि मुझे पता है, हो सकता है -

(ध्यान दें कि पहली वेबसाइट पर कहा गया है Pizelformat वास्तव में Pixelformat है) कुछ के लिए कुछ भ्रम पैदा करते हैं।

पिक्सेल शिकार को तेज करने के तरीके को लागू करने के बाद, गति में इतना वृद्धि नहीं हुई। तो मुझे लगता है कि मैं कुछ गलत कर रहा हूँ।

40 छवियों के लिए पुराना समय = 15.63।

40 छवियों

मैं महान लेख DocMax quoted साथ देखा के लिए

नई समय = 15.43, कि कोड "ताले" पिक्सल के एक सेट में। (या यह है कि मैं इसे कैसे समझता हूं) तो मैंने जो किया वह प्रत्येक पृष्ठ के पिक्सल की मध्य पंक्ति में लॉक है। क्या यह सही कदम होगा?

private int testPixels(String sourceDir) 
    { 
     //iterate through images 
     string[] fileEntries = Directory.GetFiles(sourceDir).Where(x => x.Contains("JPG")).ToArray(); 

     var q = from string x in Directory.GetFiles(sourceDir) 
       where x.ToLower().EndsWith(".jpg") 
       select new FileInfo(x); 

     int holder = 1; 
     foreach (var z in q) 
     { 
      Bitmap mybm= Bitmap.FromFile(z.FullName) as Bitmap; 
      int blank = getPixelData2(mybm); 

      if (blank == 0) 
      { 
       holder = 0; 
       break; 
      } 
     } 
     return holder; 
    } 

और फिर वर्ग

private unsafe int getPixelData2(Bitmap bm) 
     { 
      BitmapData bmd = bm.LockBits(new System.Drawing.Rectangle((bm.Width/2), 0, 1, bm.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat); 

      int blue; 
      int green; 
      int red; 

      int width = bmd.Width/2; 
      for (int y = 0; y < bmd.Height; y++) 
      { 
       byte* row = (byte*)bmd.Scan0 + (y * bmd.Stride); 

       blue = row[width * 3]; 
       green = row[width * 2]; 
       red = row[width * 1]; 

       // Console.WriteLine("Blue= " + blue + " Green= " + green + " Red= " + red); 
       //Check to see if there is some form of color 
       if ((blue != 255) || (green != 255) || (red != 255)) 
       { 
        bm.Dispose(); 
        return 1; 
       } 
      } 
      bm.Dispose(); 
      return 0; 
     } 
+0

क्या आपने समय लगाया है कि कितना समय लगता है? यदि हां, तो समय क्या था और छवि की ऊंचाई क्या थी? – 3aw5TZetdf

+1

आपको अपने कार्यान्वयन में कुछ गलत करना होगा, क्योंकि आपका एल्गोरिदम मुझे लगता है। एक कॉलम ऑफा बिटमैप को स्कैन करने में कोई समय नहीं लगना चाहिए। –

+0

32 छवियों के लिए कुल समय = 00: 00: 12.9187389 ऊंचाई = 6552 चौड़ाई = 4580 – Ruan

उत्तर

7

आप गलत होने की संभावना को सहन कर सकते हैं, दृष्टिकोण ठीक लग रहा है; मैंने अपने मामले में कुछ ऐसा ही किया है, हालांकि त्रुटियों से निपटने के लिए मेरे पास हमेशा एक दृश्य पुष्टि थी।

प्रदर्शन के लिए, मुख्य खुला प्रश्न यह है कि आप परीक्षण करने के लिए पिक्सल कैसे प्राप्त कर रहे हैं। यदि आप Bitmap.GetPixel का उपयोग कर रहे हैं, तो आप प्रदर्शन समस्याओं के लिए बाध्य हैं। (बहुत सारी चर्चा देखने के लिए Google में "Bitmap.GetPixel slow" खोजें।)

बहुत बेहतर प्रदर्शन सभी पिक्सेल को एक बार में प्राप्त करने और फिर उन पर लूपिंग करने से आएगा। मुझे स्पष्टता और पूर्णता के लिए व्यक्तिगत रूप से Bob Powell's LockBits discussion पसंद है। उस दृष्टिकोण के साथ, सभी प्रदर्शन पिक्सल की जांच करना आपकी प्रदर्शन आवश्यकताओं के आधार पर उचित हो सकता है।

+0

आप वास्तव में स्पॉट पर हैं, मैं बिटमैप.गेट पिक्सेल का उपयोग कर रहा हूं। धन्यवाद, बीमार उस समाधान को जांचें, और यहां मेरे निष्कर्ष पोस्ट करें ताकि एक पूर्ण समाधान हो और छवि की जांच करने के तरीके पर "मैं कहूं कि" कहने की हिम्मत हो। – Ruan

+0

इसलिए मैंने समाधान को कार्यान्वित किया। एकमात्र चीज यह है कि समय 40 छवियों के लिए पुराना समय = 15.63 लगभग समान है। और 40 छवियों के लिए नया समय = 15.43 है। मैंने अपने प्रश्न पर अतिरिक्त जानकारी के रूप में समझाया जो मैंने किया था। – Ruan

+0

यह इसे एक अंश के साथ गति देता है। मुझे लगता है कि मेरे पास मौजूद डेटा की मात्रा में वृद्धि देखना मुश्किल है। धन्यवाद – Ruan

2

आप System.Drawing.Bitmap उपयोग कर रहे हैं आप चीज़ों को गति कर सकते हैं (काफी), द्वारा:

  1. GetPixel का उपयोग नहीं पिक्सल, उपयोग LockBits और UnlockBits का उपयोग करने के लिए छवि बिटमैप कॉपी करने के लिए नियमित स्मृति उपयोग के लिए MSDN documentation पर उदाहरण देखें।
  2. लूप के लिए चौड़ाई, ऊंचाई या आकार गुणों को कॉल नहीं करना। एक बार कॉल आकार, मानों को स्थानीय चर में संग्रहीत करें और लूप में उनको उपयोग करें।

नोट्स:

  1. जब System.Drawing.Bitmap अपनी छवि का उपयोग कर डिवाइस स्मृति में हो सकता है और इसे एक्सेस करने में काफ़ी समय हो सकता है।
  2. मुझे याद नहीं है कि बिटमैप में कोई छवि लोड करने से पहले ही इसे आरजीबी प्रारूप में परिवर्तित कर दिया गया है क्योंकि अन्य प्रारूपों के साथ काम करना अधिक कठिन होता है, लेकिन यदि ऐसा नहीं है तो आप अपने आकार के आरजीबी बिटमैप को बना सकते हैं मूल छवि, इसे ग्राफ़िक ऑब्जेक्ट (Graphics.FromImage) प्राप्त करें और आरजीबी बिटमैप में मूल छवि को आकर्षित करने के लिए DrawImage का उपयोग करें।

संपादित करें: डॉकमैक्स द्वारा पंच को मारो।

किसी भी मामले में गति के लिए आप उत्कृष्ट पुस्तकालयों जैसे उत्कृष्ट FreeImage का उपयोग करने का प्रयास कर सकते हैं जिसमें सी # रैपर शामिल हैं।

0

स्केल 1x1 करने के लिए छवि तो एक पिक्सेल

नया बिटमैप जाँच (previousImage, नए आकार (1, 1));

+0

यह शानदार है, दुर्भाग्यवश यह उन अधिकांश छवियों पर काम नहीं करता है जिनके साथ मैंने कोशिश की है (अरबी रंग मानों के साथ 64x56 टाइल्स का एक सेट)। स्रोत में कुछ छवि डेटा होने पर भी एकल पिक्सेल अक्सर 0,0,0,0 होता है। – PeteB

+0

मैंने 2x2 का उपयोग करके और चार चार पिक्सेल की जांच करके एक और परीक्षण किया। यह बेहतर था लेकिन अभी भी टाइल में थोड़ी सी मात्रा में खाली होने पर खाली सूचना मिली थी। – PeteB

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