2010-09-15 18 views

Trả lời

4

Nếu pixel() là quá chậm đối với bạn, hãy xem xét hơn hiệu quả dữ liệu hàng khôn ngoan, được cung cấp một 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; 
    } 
} 

Tôi nghi ngờ nó sẽ nhanh hơn thế này.

+0

+1: Tốt. Tôi vừa xem xét tùy chọn scanLine(). –

+0

Không giống như các tài liệu Qt đang quảng cáo tốt. Đã cho tôi nửa năm để tìm hiểu về nó. – ypnos

+1

Tôi đã làm một vài thời gian thô của nhiệm vụ trên tất cả của tôi mà không tạo ra một tiêu chuẩn vi mô. Cách tiếp cận này sử dụng cơ bản cùng một lượng thời gian cpu như giải pháp của Arnold, nhưng giảm thời gian đồng hồ treo tường. – retracile

3

Có một tùy chọn liên quan đến việc sử dụng số QGraphicsPixmapItem và truy vấn hộp giới hạn của khu vực mờ đục (QGraphicsPixmapItem::opaqueArea().boundingRect()). Không chắc chắn nếu nó là cách tốt nhất nhưng nó hoạt động :) Nó có thể là giá trị đào vào mã nguồn của Qt để xem mã nào là trái tim của nó.

Các mã sau đây sẽ in ra chiều rộng và chiều cao của hình ảnh tiếp theo là chiều rộng và chiều cao của phần mờ đục của hình ảnh:

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() xây dựng toàn bộ Đường dẫn mô tả khu vực. Điều đó sẽ chậm hơn so với tính toán hình chữ nhật bounding đơn giản. – ypnos

+0

Hy vọng rằng OP có thể đăng một số kết quả định thời gian. Tôi muốn được quan tâm để xem có bao nhiêu thời gian cả hai lựa chọn mất. Nhưng có, đối với những hình ảnh phức tạp, tôi chỉ có thể tưởng tượng nó chậm hơn. –

+0

Tôi đã thực hiện một số thời gian khắc nghiệt của tác vụ trên tất cả của mình mà không cần tạo điểm chuẩn vi mô. Cách tiếp cận này sử dụng cơ bản cùng một lượng thời gian đồng hồ treo tường như các vòng lặp lồng nhau của tôi, nhưng tốn ít thời gian cpu hơn. – retracile

Các vấn đề liên quan