2011-08-16 52 views
8

Có bất kỳ giới hạn kích thước/không gian nào đã biết của QPixmap và/hoặc QImage đối tượng được ghi lại không? Tôi không tìm thấy bất kỳ thông tin hữu ích nào về vấn đề này. Tôi hiện đang sử dụng Q.3 4.7.3 trên OSX và Windows. Particulary Tôi quan tâm đến:Giới hạn kích thước QPage/QPixmap?

  • Giới hạn chiều rộng/chiều cao?
  • Giới hạn tùy thuộc vào định dạng màu?
  • Sự khác biệt giữa các máy 32/64 bit?
  • Sự khác biệt về hệ điều hành?

tôi sẽ ngây thơ cho rằng bộ nhớ đó là hạn chế duy nhất, vì vậy người ta có thể tính toán kích thước tối đa của

chiều cao x chiều rộng x byte_per_pixel

tôi cho rằng có một quy tắc phức tạp hơn ngón tay cái; các máy 32 bit cũng có thể gặp sự cố khi bạn chạy vào các thứ nguyên GB.

Cuối cùng, tôi muốn lưu trữ nhiều hình ảnh RGBA có kích thước khoảng 16000x16000 pixel và hiển thị chúng bằng cách sử dụng độ trong suốt với nhau trong một QGraphicsScene. Các máy trạm có sẵn có rất nhiều RAM, giả sử 16GB.

tl; dr: Giới hạn kích thước của QImage/QPixmap mà bạn biết hoặc tôi có thể tìm thông tin đó ở đâu?

Chỉnh sửa: Tôi biết về phương pháp ốp lát và tôi ổn với điều đó. Tuy nhiên nó sẽ là tuyệt vời để biết những điều mô tả ở trên.

Cảm ơn!

Trả lời

9

Cả hai giới hạn ở 32767x32767 pixel. Tức là, bạn có thể nghĩ về chúng khi sử dụng giá trị 16 bit có chữ ký cho cả độ phân giải X và Y.

Không có trục nào có thể vượt quá 32767 pixel, ngay cả khi trục kia chỉ là 1 pixel. Hệ điều hành "bitness" không ảnh hưởng đến giới hạn. Hệ thống cơ bản có thể chạy vào các giới hạn khác, chẳng hạn như bộ nhớ như bạn đã đề cập, trước khi một hình ảnh lớn như vậy có thể được tạo ra.

Bạn có thể xem ví dụ về hạn chế này trong mã nguồn sau đây: http://git.zx2c4.com/qt/plain/src/gui/image/qpixmap_x11.cpp

if (uint(w) >= 32768 || uint(h) >= 32768) { 
    w = h = 0; 
    is_null = true; 
    return; 
} 
+0

Điều này có thể đúng cho 'QPixmap', nhưng đối với các giới hạn của' QImage', hãy xem câu trả lời của @ povman. –

2

tôi thực sự đã có dịp để nhìn vào điều này cùng một lúc. Thực hiện tìm kiếm trong mã nguồn của qimage.cpp để "kiểm tra độ chính xác cho các tình trạng tràn tiềm năng" và bạn có thể xem các kiểm tra mà Qt đang thực hiện. Về cơ bản,

  • Số byte yêu cầu (width * height * depth_for_format) phải nhỏ hơn INT_MAX.
  • Bạn phải có thể malloc các byte đó tại thời điểm bạn đang tạo ví dụ QImage.
0

Bạn đang xây dựng ứng dụng 64 bit phải không? Nếu không, bạn sẽ gặp vấn đề về bộ nhớ rất nhanh.Trên Windows, ngay cả khi máy có RAM 16 GB, quy trình 32 bit sẽ bị giới hạn ở mức 2GB (Trừ khi nó là LARGEADDRESSAWARE rồi 3 GB). Một hình ảnh 16000x16000 sẽ chỉ dưới 1 GB, vì vậy bạn sẽ chỉ có thể phân bổ đủ bộ nhớ cho 1, có thể 2 nếu bạn rất may mắn.

Với ứng dụng 64 bit, bạn sẽ có thể phân bổ đủ bộ nhớ cho một số hình ảnh.

4

Dựa trên câu trả lời của @ charles-bỏng, đây là mã nguồn có liên quan cho QImage:

QImageData *d = 0; 

if (format == QImage::Format_Invalid) 
    return d; 

const int depth = qt_depthForFormat(format); 
const int calc_bytes_per_line = ((width * depth + 31)/32) * 4; 
const int min_bytes_per_line = (width * depth + 7)/8; 

if (bpl <= 0) 
    bpl = calc_bytes_per_line; 

if (width <= 0 || height <= 0 || !data 
    || INT_MAX/sizeof(uchar *) < uint(height) 
    || INT_MAX/uint(depth) < uint(width) 
    || bpl <= 0 
    || height <= 0 
    || bpl < min_bytes_per_line 
    || INT_MAX/uint(bpl) < uint(height)) 
    return d;          // invalid parameter(s) 

Vì vậy, ở đây, bpl là số byte trên mỗi dòng, đó là một cách hiệu quả width * depth_in_bytes. Sử dụng đại số trên mà kiểm tra không hợp lệ thức:

  • INT_MAX/uint(bpl) < uint(height)
  • INT_MAX < uint(height) * uint(bpl)
  • INT_MAX < height * width * depth_in_bytes

Vì vậy, kích thước hình ảnh của bạn trong tổng số phải (ints cho 32-bit) ít hơn 2147483647.

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