2010-09-15 13 views

Odpowiedz

4

Jeśli piksel() jest zbyt powolne dla Ciebie, zastanów się więcej Efektywne dane w wierszach, biorąc pod uwagę QImage p:

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

Wątpię, czy będzie to szybsze.

+0

+1: Nice. Właśnie miałem spojrzeć na opcję scanLine(). –

+0

To nie tak, że docenci docenili to dobrze. Zajęło mi to pół roku, żeby się o tym dowiedzieć. – ypnos

+1

Zrobiłem kilka trudnych chwil w moim ogólnym zadaniu bez tworzenia mikro-testu porównawczego. Podejście to wykorzystywało zasadniczo tę samą ilość czasu procesora, co rozwiązanie Arnolda, ale zmniejszyło czas zegara ściennego. – retracile

3

Istnieje jedna opcja, która wymaga użycia QGraphicsPixmapItem i zapytania o obwiednię obszaru nieprzezroczystego (QGraphicsPixmapItem::opaqueArea().boundingRect()). Nie jestem pewien, czy to najlepszy sposób, ale działa :) Może warto zagłębić się w kod źródłowy Qt, aby zobaczyć, jaki kod jest w jego sercu.

Poniższy kod wypisze szerokość i wysokość obrazu, a następnie przez szerokość i wysokość nieprzezroczystych części obrazka:

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() tworzy całą ścieżkę opisującą obszar. To powinno być wolniejsze niż proste obliczanie prostokąta granicznego. – ypnos

+0

Mam nadzieję, że OP może opublikować wyniki czasowe. Byłbym zainteresowany, aby zobaczyć, ile czasu zajmuje obie opcje. Ale tak, w przypadku skomplikowanych obrazów mogę sobie tylko wyobrazić, że jest wolniejszy. –

+0

Zrobiłem kilka trudnych chwil w moim ogólnym zadaniu bez tworzenia mikro-testu porównawczego. Podejście to wykorzystywało w zasadzie taką samą ilość czasu w ścianie jak moje zagnieżdżone pętle for, ale zabierało mniej czasu procesora. – retracile

Powiązane problemy