Sự khác biệt giữa QImage và QPixmap là gì?


84

Tôi không hiểu sự khác biệt giữa QImage và QPixmap là gì, chúng dường như cung cấp cùng một chức năng. Khi nào tôi nên sử dụng QImage và khi nào tôi nên sử dụng QPixmap?


Tôi không chắc liệu mình có hiểu câu hỏi của bạn hay không, nhưng tôi nghĩ rằng nó khá rõ ràng trong tài liệu: "QImage được thiết kế và tối ưu hóa cho I / O, để truy cập và thao tác trực tiếp pixel, trong khi QPixmap được thiết kế và tối ưu hóa để hiển thị hình ảnh trên màn hình." doc.qt.nokia.com/latest/qpixmap.html#details
cgmb

1
vâng! Tôi đã tìm ra nó, nhưng không hiểu rõ, ví dụ, được tối ưu hóa cho I / O và tối ưu hóa để hiển thị, đó là sự khác biệt mà picutre hiển thị trên nền tảng khác nhau? ..Bạn có thể giúp tôi thực hiện một bước để giải thích .. cảm ơn bạn ..
Mr.Tu

Tôi vẫn không chắc chắn 100% rằng tôi biết ý bạn là gì, nhưng nếu bạn đang sử dụng QWidgets, bạn có thể hiển thị nó trong QLabel. Nếu đang sử dụng QGraphicsView, bạn có thể hiển thị nó trong QGraphicsPixmapItem. Nếu bạn đang sử dụng QML, phần tử Hình ảnh sẽ xử lý mọi thứ cho bạn.
cgmb

Để tôi nói một cách khác, Engine là gì, công việc của nó là gì? khi nào sử dụng nó?
Mr.Tu

Câu trả lời:


55

Dễ dàng trả lời bằng cách đọc tài liệu trên QImageQPixmap :

Lớp QPixmap là một biểu diễn hình ảnh ngoài màn hình có thể được sử dụng như một thiết bị sơn.

Lớp QImage cung cấp một biểu diễn hình ảnh độc lập với phần cứng 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.

Chỉnh sửa: Ngoài ra, từ câu trả lời của @ Dave:

Bạn không thể thao tác QPixmap bên ngoài luồng GUI, nhưng QImage không có hạn chế như vậy.

Và từ @Arnold:

Dưới đây là một bản tóm tắt ngắn thường (không phải lúc nào cũng áp dụng):

  • Nếu bạn định xử lý một hình ảnh, sửa đổi hình ảnh, thay đổi pixel trên hình ảnh đó, v.v., hãy sử dụng QImage.
  • Nếu bạn định vẽ cùng một hình ảnh nhiều lần trên màn hình, hãy chuyển đổi hình ảnh đó thành QPixmap.

nhờ sự giúp đỡ của bạn ... quá trình nói chung là những gì mà QPixmpa và QImage tải một hình ảnh .. là những gì nó trong bộ nhớ .. cảm ơn bạn ..
Mr.Tú

Tôi không chắc bạn đang cố gắng làm gì, nhưng trong câu hỏi này, tôi trình bày cách tải dữ liệu YV12 từ đĩa, chuyển đổi sang RGB bằng cách sử dụng trình đổ bóng phân đoạn GLSL, sau đó hiển thị nó trên màn hình bên trong QImage. Tôi đoán tôi có thể chỉ cho bạn hướng đi đúng nếu bạn hiểu rõ hơn về những gì bạn đang cố gắng hoàn thành.
karlphillip

14
Điều này có thực sự trả lời bất cứ điều gì?
spinkus

7
Chỉ sao chép tài liệu và câu trả lời của người khác không có ý nghĩa.
Viacheslav Kroilov

48

Có một loạt các bài viết tại Qt Labs giải thích rất nhiều về hệ thống đồ họa Qt. Bài viết này nói riêng có một phần trên QImagevs QPixmap.

Dưới đây là một bản tóm tắt ngắn thường (không phải lúc nào cũng áp dụng):

  • Nếu bạn định thao tác một hình ảnh, sửa đổi nó, thay đổi pixel trên nó, v.v., hãy sử dụng a QImage.
  • Nếu bạn định vẽ cùng một hình ảnh nhiều lần trên màn hình, hãy chuyển đổi nó thành a QPixmap.

cảm ơn bạn. Đoạn văn này cho chúng ta biết: có hai cách khác nhau để tải một hình ảnh, raster và OpenGL? đúng?
Mr.Tu

Tôi không hoàn toàn hiểu câu hỏi. Cả "raster" và "OpenGL" đều không đại diện cụ thể cho các cách tải ảnh.
Arnold Spence

37

Một điểm khác biệt quan trọng là bạn không thể tạo hoặc thao tác QPixmaptrên bất kỳ thứ gì ngoài luồng GUI chính. Tuy nhiên, bạn có thể tạo và thao tác các QImagethể hiện trên các luồng nền và sau đó chuyển đổi chúng sau khi chuyển chúng trở lại luồng GUI.


22

Quan trọng trong môi trường công nghiệp:

QPixmap được lưu trữ trên thẻ video để hiển thị. Không phải QImage.

Vì vậy, nếu bạn có một máy chủ đang chạy ứng dụng và một trạm khách thực hiện việc hiển thị, thì điều đó rất quan trọng về mặt sử dụng mạng.

Với Pixmap, Redraw chỉ bao gồm việc gửi thứ tự để vẽ lại (một vài byte) qua mạng.

Với QImage, nó bao gồm gửi toàn bộ hình ảnh (khoảng vài MB).


19
  • QPixmap là một "đối tượng hình ảnh" mà việc pixelbiểu diễn không liên quan đến mã của bạn, Do đó QPixmap được thiết kế và tối ưu hóa để hiển thị hình ảnh trên màn hình hiển thị, nó được lưu trữ trên XServer khi sử dụng X11, do đó vẽ QPixmap trên XWindow nhanh hơn nhiều so với bản vẽ QImages, vì dữ liệu đã có trên máy chủ và sẵn sàng sử dụng.

    Khi nào sử dụng QPixmap : Nếu bạn chỉ muốn vẽ một hình ảnh hiện có (biểu tượng .. nền .. vv) đặc biệt nhiều lần, hãy sử dụng QPixmap.

  • QImage là một "mảng pixel trong bộ nhớ" của mã máy khách , QImage được thiết kế và tối ưu hóa cho I / O cũng như để truy cập và thao tác trực tiếp pixel.

    Khi nào sử dụng QImage : Nếu bạn muốn vẽ, bằng Qpaint, hoặc thao tác với pixel hình ảnh.

  • QBitmap chỉ là một lớp con QPixmap thuận tiện đảm bảo độ sâu là 1, ảnh pixmap đơn sắc (độ sâu 1 bit) của nó. Cũng giống như QPixmap, QBitmap được tối ưu hóa để sử dụng chia sẻ dữ liệu ngầm.

  • QPicture là một thiết bị sơn ghi và phát lại các lệnh QPainter - bản vẽ của bạn -
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.