2012-01-09 24 views
8

Tôi đang phát triển một chương trình phải tính toán màu của mỗi điểm trên hình ảnh 1024x1024 bằng thuật toán đặc biệt. Màu của một điểm đại diện cho một số giá trị. Vì vậy, mỗi điểm độc lập với các điểm khác và phải được vẽ riêng. Tôi không phải làm mới hình ảnh quá thường xuyên. Thực ra, tôi chỉ cần hiển thị nó một lần.Qt. Cách nhanh nhất để vẽ 1024x1024 chấm trên màn hình

Cách tiếp cận nhanh nhất để vẽ các pixel riêng biệt trong Qt là gì?

Tôi có thể nhận được một số loại "bộ nhớ màn hình" và viết tất cả các hình ảnh như một mảng các bộ 4 byte, đại diện cho mỗi pixel là 4 byte trong bộ nhớ đó?

Trả lời

7

Lớp QImage được tối ưu hóa cho thao tác pixel. Bạn có thể khởi tạo một với kích thước được yêu cầu lại và sau đó thiết lập các pixel riêng lẻ setPixel hoặc truy cập dữ liệu thô và thao tác chúng tại chỗ qua bits(). Chỉ cần chắc chắn sử dụng định dạng chính xác (ví dụ: giá trị RGBA hoặc chỉ số màu cho hình ảnh 8 bit)

6

Giải pháp nhanh nhất có thể là tạo một QImage, điều khiển nó (đặt pixel) và sau đó nhận được Qt để vẽ nó.

Lớp QImage là cho nhanh IO, từ hướng dẫn:

Các QImage lớp cung cấp một đại diện hình ảnh phần cứng độc lập cho phép truy cập trực tiếp vào dữ liệu pixel, và có thể được sử dụng như một thiết bị sơn.

Lớp QImage hỗ trợ một số định dạng hình ảnh được mô tả bằng định dạng enum. Chúng bao gồm các ảnh đơn sắc, 8-bit, 32-bit và alpha-pha trộn sẵn có trong tất cả các phiên bản của Qt 4.x.

Có thông tin về thao tác pixel trong phần Mô tả chi tiết.

Để hiển thị nó, cách đơn giản nhất là chuyển đổi nó thành một bản đồ pixmap với QPixmap::fromImage và sau đó đặt nó vào nhãn với QLabel::setPixmap.

Để có nhiều quyền kiểm soát hơn, bạn có thể xếp lớp phụ QWidget, quá tải paintEvent và vẽ hình ảnh QImage bằng QPainter với QPainter::drawImage.

+0

Vẽ lại QImage trong mỗi sự kiện sơn có thể khá đắt mặc dù tùy thuộc vào nền tảng, tốt hơn nên chuyển sang QPixmap trước khi vẽ và lưu trữ đó là pixmap. –

+0

Frank, Cảm ơn bạn! – pavelkolodin

+1

Wow, QImage cho phép tôi vẽ hình của tôi gần như ngay lập tức, tôi có FPS lớn (-; – pavelkolodin

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