2010-09-15 14 views

cevap

4

, daha düşünün bir Qimage p verilen verimli sıra sıra veri hitap,:

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; 
    } 
} 

Ben daha hızlı bundan daha bulunacağını zannetmiyorum.

+0

+1: Güzel. ScanLine() seçeneğine bakmak üzereydim. –

+0

Qt dokümanları iyi reklam gibi değil. Bunu öğrenmek için yarım yılımı aldım. – ypnos

+1

Bir mikro ölçüt oluşturmadan tüm aşırı görevimin birkaç zor zamanlamasını yaptım. Bu yaklaşım esas olarak Arnold'un çözümü olarak aynı miktarda cpu süresi kullanmış, ancak duvar saati süresini azaltmıştır. – retracile

3

QGraphicsPixmapItem'u kullanmayı ve opak alanın sınırlayıcı kutusunu sorgulamayı içeren bir seçenek var (QGraphicsPixmapItem::opaqueArea().boundingRect()). En iyi yol olup olmadığından emin değil ama işe yarıyor :) QT'nin kaynak kodunun içine ne tür bir kodun geldiğini görmek için kazmaya değer olabilir.

Aşağıdaki kod görüntünün opak kısımlarının genişliği ve yüksekliği ardından görüntünün genişliğini ve yüksekliğini yazdıracaktır: piksel() sizin için çok yavaş ise

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() alanı tanımlayan bir yol oluşturur. Bu basit sınırlayıcı dikdörtgen hesaplamadan daha yavaş olmalıdır. – ypnos

+0

Umarım, OP bazı zamanlama sonuçlarını yayınlayabilir. Her iki seçeneğin ne kadar zaman alacağını görmek isterdim. Ama evet, karmaşık görüntüler için sadece daha yavaş olduğunu hayal edebiliyorum. –

+0

Bir mikro ölçüt oluşturmadan, tüm görevlerimin birkaç zor zamanlamasını yaptım. Bu yaklaşım aslında benim iç içe geçmiş döngülerimle aynı miktarda duvar saati kullanmış, ancak daha az cpu süresi almıştır. – retracile

İlgili konular