2012-05-03 29 views
6

Tôi đang làm việc trên một ứng dụng tạo ra một ma trận - sử dụng Java 2D - có thể trở nên khá lớn, ví dụ: 30000 x 30000 pixel. Tại thời điểm này, tôi đã thử nghiệm một chút với BufferedImage nhưng việc tạo ra một BufferedImage rất lớn gây ra các ngoại lệ bộ nhớ, ngay cả khi mở rộng vùng heap. Bây giờ tôi đã suy nghĩ chia hình ảnh thành nhiều hình ảnh/khu vực, và khi tôi hoàn thành một vùng nhất định, hãy ghi nó vào đĩa và tạo vùng mới/BufferedImage và tiếp tục vẽ. Tôi quan tâm đến suy nghĩ của người khác về cách họ xử lý việc này. Tôi đã đi từ Java trong một thời gian vì vậy bất kỳ ví dụ cụ thể được chào đón.Tạo và vẽ hình ảnh lớn (được đệm) trong Java

+0

Bạn có thể đăng mã của mình không? – eabraham

Trả lời

3

Tôi đóng góp cho dự án nguồn mở mới/nhỏ có thể khá phù hợp với nhu cầu của bạn.

Dự án là Glimpse. Mục đích của nó là hỗ trợ xây dựng các hình ảnh hóa dữ liệu 2D trong Java với trọng tâm là xử lý dữ liệu lớn tốt và giúp dễ dàng cung cấp tương tác thời gian thực để cho phép dễ dàng khám phá dữ liệu.

Glimpse Head Map

Nó sử dụng OpenGL để tận dụng lợi thế của các tính năng phần cứng trên GPU hiện đại như bộ nhớ kết cấu và shaders để đạt được các mục tiêu trên. Vì vậy, nếu bạn đang thiết lập trên bằng cách sử dụng Java2D thì điều này sẽ không làm việc cho bạn. Tuy nhiên, các bảng Glimpse có thể được đặt cạnh nhau với các thành phần Swing khác, do đó rất dễ dàng thả vào GUI Swing hiện có của bạn. Chỉ báo trước rằng bạn sẽ cần một card đồ họa khá.

Hình ảnh là ví dụ về ma trận dữ liệu lớn có màu được điều chỉnh động thông qua thang màu bên phải (dữ liệu ma trận được lưu trữ trong kết cấu GPU và tái tạo màu động được thực hiện thông qua trình đổ bóng tùy chỉnh). Nguồn cho ví dụ này là HeatMapExample.java. Có rất nhiều ví dụ khác như là cung cấp các điểm khởi đầu để làm việc với các tính năng khác của Glimpse.

Bạn có thể tìm hiểu thêm tại glimpse.metsci.com. Có video giới thiệu ở trang đầu, cùng với Java WebStart examples. Nguồn được lưu trữ trên GitHub.

+0

Thú vị, chắc chắn sẽ xem xét điều này. Cảm ơn. – RBaarda

1

nếu bạn chỉ muốn tạo hình ảnh trên đĩa, sau đó xem pngj - nó có thể tạo ra ảnh lớn png không có vấn đề gì vì nó ghi các dòng pixel vào đĩa khi chúng có sẵn. api là một chút cụ thể, nhưng nó không quá phức tạp (nó có thể giúp đọc một chút nền trên định dạng hình ảnh png trước khi sử dụng nó).

+0

Cảm ơn câu trả lời của bạn. Tôi đã nhìn vào pngj, nhưng tôi vẫn đang tìm ra cách bạn sẽ vẽ ví dụ như một BufferedImage vào đĩa bằng cách sử dụng pngj. – RBaarda

+0

bạn sẽ không. tôi nghĩ rằng vấn đề là hình ảnh đệm có quá nhiều bộ nhớ? pngj tránh được điều đó - bạn ghi các pixel trực tiếp vào đĩa. xin lỗi nếu tôi đã hiểu lầm. –

+0

Xin lỗi vì đã gây nhầm lẫn, nhưng bạn đúng đó là vấn đề. Hãy để tôi đặt nó theo cách này, làm thế nào bạn sẽ sử dụng Java 2D api cùng với PNGJ? – RBaarda

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