2010-09-15 13 views

Antwort

4

Wenn Pixel() für Sie zu langsam ist, sollten Sie mehr effiziente reihenweise Daten adressing, ein QImage p gegeben:

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

ich bezweifle es schneller als das bekommen.

+0

+1: Nizza. Ich wollte gerade die Option scanLine() betrachten. –

+0

Es ist nicht wie Qt-Docs es gut werben. Nahm mich ein halbes Jahr, um es herauszufinden. – ypnos

+1

Ich habe ein paar grobe Zeiten meiner Gesamtaufgabe gemacht, ohne einen Mikro-Benchmark zu erstellen. Dieser Ansatz verwendete im Wesentlichen die gleiche Menge an CPU-Zeit wie Arnolds Lösung, reduzierte jedoch die Wanduhrzeit. – retracile

3

Es gibt eine Option, die die Verwendung einer QGraphicsPixmapItem und die Abfrage der Begrenzungsbox des undurchsichtigen Bereichs (QGraphicsPixmapItem::opaqueArea().boundingRect()) umfasst. Nicht sicher, ob es der beste Weg ist, aber es funktioniert :) Es könnte sich lohnen, in Qt's Quellcode zu gucken, um zu sehen, welcher Code das Herzstück ist.

Der folgende Code wird die Breite und Höhe des Bildes durch die Breite und Höhe der undurchsichtigen Teile des Bildes gefolgt ausdrucken:

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() erstellt einen ganzen Pfad, der den Bereich beschreibt. Das sollte langsamer sein als die Berechnung eines einfachen Begrenzungsrechtecks. – ypnos

+0

Hoffentlich kann das OP einige Timing-Ergebnisse veröffentlichen. Es würde mich interessieren, wie viel Zeit beide Optionen benötigen. Aber ja, für komplizierte Bilder kann ich mir nur vorstellen, dass es langsamer ist. –

+0

Ich habe ein paar grobe Zeiten meiner Gesamtaufgabe gemacht, ohne einen Mikro-Benchmark zu erstellen. Dieser Ansatz verwendete im Wesentlichen die gleiche Wanduhrzeit wie meine verschachtelten for-Schleifen, benötigte aber weniger CPU-Zeit. – retracile

Verwandte Themen