2009-03-05 30 views
5

Tôi phải hiển thị một hình ảnh rất lớn (> 50.000 ² pixel) với cairo. Để làm điều này mà không cần hết bộ nhớ, tôi hiển thị các phần của hình ảnh (< 1.000² pixel) cái khác và hợp nhất chúng lại với nhau sau.Hình ảnh lớn với cairo

  1. Tạo 1000x1000 Surface
  2. Dịch vị trí của các phần hiện
  3. ảnh Draw (gọi các hướng dẫn vẽ bằng pycairo)
  4. Render/Lưu ảnh vào file (cairo_surface_write_to_png)
  5. Lặp lại với tiếp theo một phần

Vì thuật toán cắt nhanh hơn của chính tôi, bước ba vẽ toàn bộ hình ảnh, ngay cả khi chỉ một phần của nó có thể nhìn thấy được. Hầu hết CPU được sử dụng trong Bước 3 (bằng python). Hầu hết bộ nhớ được sử dụng trong Bước 4 (bởi cairo).

Có cách nào để tăng tốc độ không? Một cái gì đó như thế này?

  1. Tạo 1000x1000 Surface
  2. ảnh Draw
  3. Di chuyển tất cả mọi thứ về vị trí của phần hiện
  4. Render/Lưu ảnh vào file
  5. Lặp lại 3 với phần tiếp theo

hoặc

  1. Tạo 50000x50000 Surface
  2. ảnh Draw
  3. Render/Save chỉ là phần hiện tại của ảnh vào file
  4. Lặp lại 3 với phần tiếp theo

Trả lời

2

Trước hết, sử dụng C hoặc Vala thay vì Python sẽ có thể tăng tốc độ.

Về mức sử dụng bộ nhớ, tôi sẽ cố gắng ghi vào luồng của riêng mình chứ không phải tệp (xem write_to_png_stream). Điều này có thể cho phép bạn (tôi đã không thử điều này) kiểm soát việc sử dụng bộ nhớ, giả sử Cairo không gọi chức năng của bạn chỉ một lần sau khi tất cả mọi thứ được thực hiện.

+0

Một ngôn ngữ khác không phải là một tùy chọn và cũng không giải quyết được vấn đề, nhưng write_to_png_stream là một ý tưởng hay. Cảm ơn – defnull

+0

Bạn được chào đón. Tôi hy vọng nó hoạt động. –

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