2010-09-15 12 views
8

एक पारदर्शी पृष्ठभूमि के साथ .png छवि को देखते हुए, मैं गैर-पारदर्शी डेटा के बाध्यकारी बॉक्स को ढूंढना चाहता हूं। QImage.pixel() के साथ नेस्टेड for लूप का उपयोग दर्दनाक रूप से धीमा है। क्या क्यूटी में ऐसा करने का एक अंतर्निहित तरीका है?क्या क्यूटी के पास छवि के बाध्यकारी बॉक्स को खोजने का कोई तरीका है?

उत्तर

4

तो पिक्सेल() आप के लिए बहुत धीमी है, और अधिक करने पर विचार कुशल पंक्ति-वार डेटा को संबोधित, एक QImage पी दिया:

int l =p.width(), r = 0, t = p.height(), b = 0; 
for (int y = 0; y < p.height(); ++y) { 
    QRgb *row = (QRgb*)p.scanLine(y); 
    bool rowFilled = false; 
    for (int x = 0; x < p.width(); ++x) { 
     if (qAlpha(row[x])) { 
      rowFilled = true; 
      r = std::max(r, x); 
      if (l > x) { 
       l = x; 
       x = r; // shortcut to only search for new right bound from here 
      } 
     } 
    } 
    if (rowFilled) { 
     t = std::min(t, y); 
     b = y; 
    } 
} 

मुझे शक है कि यह किसी भी इस से भी तेज हो जाएगा।

+0

+1: अच्छा। मैं बस scanLine() विकल्प को देखने के बारे में था। –

+0

ऐसा नहीं है कि क्यूटी दस्तावेज़ इसे अच्छी तरह से विज्ञापन कर रहे हैं। इसके बारे में पता लगाने के लिए मुझे आधा साल लगा। – ypnos

+1

मैंने माइक्रो-बेंचमार्क बनाने के बिना अपने पूरे कार्य के कुछ कठिन समय किए। यह दृष्टिकोण अर्नोल्ड के समाधान के रूप में अनिवार्य रूप से सीपीयू-टाइम की समान मात्रा में उपयोग किया जाता था, लेकिन दीवार घड़ी का समय कम हो गया था। – retracile

3

एक विकल्प है जिसमें QGraphicsPixmapItem का उपयोग करना और अपारदर्शी क्षेत्र (QGraphicsPixmapItem::opaqueArea().boundingRect()) के बाध्यकारी बॉक्स के लिए पूछताछ करना शामिल है। सुनिश्चित नहीं है कि यह सबसे अच्छा तरीका है लेकिन यह काम करता है :) यह देखने के लिए क्यूटी के स्रोत कोड में खुदाई हो सकती है कि यह देखने के लिए कि कौन सा कोड है।

निम्नलिखित कोड चौड़ाई और छवि चौड़ाई और छवि के अपारदर्शी भागों की ऊंचाई के बाद की ऊंचाई प्रिंट आउट देगा:

QPixmap p("image.png"); 
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(p); 
std::cout << item->boundingRect().width() << "," << item->boundingRect().height() << std::endl; 
std::cout << item->opaqueArea().boundingRect().width() << "," << item->opaqueArea().boundingRect().height() << std::endl; 
+0

opaqueArea() क्षेत्र का वर्णन करने वाला एक संपूर्ण पथ बनाता है। यह सरल बाध्य आयताकार गणना से धीमा होना चाहिए। – ypnos

+0

उम्मीद है कि ओपी कुछ समय के परिणाम पोस्ट कर सकता है। मुझे यह देखने में दिलचस्पी होगी कि दोनों विकल्प कितने समय लेते हैं। लेकिन हाँ, जटिल छवियों के लिए मैं केवल कल्पना कर सकता हूं कि यह धीमा हो रहा है। –

+0

मैंने माइक्रो-बेंचमार्क बनाने के बिना अपने ओवर-ऑल कार्य के कुछ कठिन समय किए। इस दृष्टिकोण ने अनिवार्य रूप से वॉल-घड़ी के समय के रूप में मेरे घोंसले के लिए इस्तेमाल किया, लेकिन कम सीपीयू समय लिया। – retracile

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

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