2010-07-20 12 views
8

Hãy xem xét các hồ sơ sau:Thư viện C nào cho phép chia tỷ lệ hình ảnh ginormous?

-rw-r--r-- 1 user user 470886479 2009-12-15 08:26 the_known_universe.png 

Làm thế nào bạn sẽ mở rộng hình ảnh xuống một độ phân giải hợp lý, không sử dụng nhiều hơn 4GB RAM?

Ví dụ:

$ convert -scale 7666x3833 the_known_universe.png 

C gì thư viện sẽ xử lý nó?

Cảm ơn bạn!

+2

Xác định lại vũ trụ đã biết để vừa với một vùng hình cầu có đường kính bảy trăm năm mét. Bản đồ sẽ nhỏ hơn nhiều và dễ thao tác hơn. –

+0

Chỉ cần tự hỏi, bạn đã thử làm điều này với ImageMagick chưa? Nếu tôi không nhầm, bạn có thể gõ khá nhiều lệnh chính xác nếu bạn đã cài đặt nó, mặc dù tôi đoán ImageMagick sẽ không thể xử lý nó. –

+1

'convert' * là * ImageMagick –

Trả lời

4

Tôi tin rằng libpng có giao diện luồng. Tôi nghĩ rằng điều này có thể được sử dụng để đọc các phần của hình ảnh tại một thời điểm; tùy thuộc vào tập tin hình ảnh bạn có thể nhận được các dòng theo thứ tự. Sau đó, bạn có thể thu nhỏ mỗi dòng (ví dụ: để thu nhỏ 50%, thu hẹp đường kẻ theo chiều ngang và loại bỏ mọi dòng thứ hai) và ghi vào tệp đầu ra.

Sử dụng libpng trong C có thể mất một số lượng mã hợp lý, nhưng tài liệu hướng dẫn bạn hướng dẫn thông qua nó khá tốt.

http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8

+0

+1 - đây là con đường để đi. Tôi đã phải làm một cái gì đó tương tự với hình ảnh của NASA và sử dụng API streaming – Anon

1

Bạn có thể thử làm một xây dựng 64 bit của ImageMagick hoặc nhìn thấy nếu có một. Đồng nghiệp của tôi đã viết một blog với bộ giải mã png siêu đơn giản (giả sử bạn có zlib hoặc tương đương) để bạn có thể xem mã bạn cần cuộn của riêng mình.

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx

Bạn sẽ cần phải làm như resample như bạn đang đọc nó trong.

+0

Bạn cũng phải chắc chắn rằng bạn biên dịch với 8 bit cho mỗi kênh. – Gabe

1

tôi đã sử dụng cximage một vài năm trước đây. Tôi nghĩ phiên bản mới nhất là http://www.xdp.it/cximage.htm sau khi chuyển khỏi CodeProject.

Edit: xin lỗi, đó là C++ không C.

1

Bạn có thể sử dụng một thư viện xử lý hình ảnh được dùng để làm các hoạt động phức tạp trên hình ảnh lớn (và nhỏ). Một ví dụ là IM imaging toolkit. Nó liên kết tốt với C (nhưng được thực hiện ít nhất một phần trong C++) và có một ràng buộc tốt với Lua. Từ ràng buộc Lua nó phải được dễ dàng để thử nghiệm.

0

Bạn đã cân nhắc khám phá hình ảnh dựa trên kim tự tháp? Hãy tưởng tượng một kim tự tháp nơi hình ảnh được chia thành nhiều lớp, mỗi lớp có độ phân giải khác nhau. Mỗi lớp được chia thành các ô. Bằng cách này, bạn có thể hiển thị phiên bản thu nhỏ của hình ảnh và cũng có thể phóng to một phần chế độ xem hình ảnh mà không phải quy mô lại.

Xem Wikipedia entry.

Một trong các định dạng gốc là FlashPix, mà tôi đã viết trình kết xuất cho. Tôi cũng đã tạo một định dạng mới của bộ chuyển đổi kim tự tháp và trình kết xuất đồ họa, được sử dụng cho một ứng dụng y tế. Một máy quét thực tế sẽ tạo ra 90GB + quét một phần của một cơ quan để nghiên cứu ung thư. Thuật toán của trình biến đổi thực sự khá phức tạp để có hiệu quả, để tạo ra hình ảnh kim tự tháp hiệu quả. Tin tưởng rằng nó hay không, nó đã thực sự dựa trên Java, và nó thực hiện tốt hơn nhiều so với bạn nghĩ. Nó sử dụng đa luồng. Điểm chuẩn cho thấy nó không chắc rằng một phiên bản C sẽ làm tốt hơn rất nhiều. Đây là 6 năm trước. Trình kết xuất ban đầu tôi đã làm cách đây hơn 10 năm. Bạn không nghe thấy bất cứ điều gì về hình ảnh dựa trên kim tự tháp nữa những ngày này.Nhưng đó thực sự là cách hiệu quả duy nhất để tạo ra các hình ảnh được chia tỷ lệ theo yêu cầu mà không phải tạo ra các phiên bản được lưu trong bộ nhớ cache.

Jpeg2000 có thể có hoặc không có tính năng kim tự tháp tùy chọn.

Tôi nhớ lại rằng định dạng và chuyển đổi của người hỗ trợ ImageMagick có lẽ, bao gồm FlashPix. Googling cho "hình kim tự tháp" cho thấy một số kết quả thú vị. Mang lại một số kỷ niệm ;-)

0

Nếu bạn có thể di chuyển nó sang hệ điều hành 64 bit, bạn có thể mở nó dưới dạng tệp ánh xạ bộ nhớ hoặc tương đương và sử dụng khá nhiều thư viện bạn muốn. Nó sẽ không được nhanh chóng, và có thể cần tăng của trang/trao đổi tập tin (tùy thuộc vào hệ điều hành và những gì khác bạn muốn làm gì với nó) nhưng đổi lại bạn sẽ không bị giới hạn trong các thư viện streaming, do đó bạn sẽ có thể thực hiện nhiều thao tác hơn trước khi giảm độ phân giải hoặc cắt.

0

libvips thoải mái với hình ảnh lớn. Đó là một thư viện xử lý ảnh trực tuyến, vì vậy nó có thể đọc từ nguồn, xử lý và ghi vào đích cùng một lúc và song song. Nó thường là 3x đến 5x nhanh hơn so với tưởng tượng và cần rất ít bộ nhớ.

Ví dụ, với PNG lớn nhất tôi có trên máy tính xách tay của tôi (1.8GB), tôi có thể giảm bớt 10x với:

$ vipsheader huge.png 
huge.png: 72000x72000 uchar, 3 bands, srgb, pngload 
$ ls -l huge.png 
-rw-r--r-- 1 john john 1785845477 Feb 19 09:39 huge.png 
$ time vips resize huge.png x.png 0.1 
real 1m35.279s 
user 1m49.178s 
sys 0m1.208s 
peak RES 230mb 

Không nhanh, nhưng không phải là quá tồi tàn một trong hai. PNG là một định dạng khá chậm, nó sẽ nhanh hơn nhiều với TIFF.

libvips có thể được cài đặt bởi hầu hết các trình quản lý gói (ví dụ: homebrew trên macOS, apt trên Debian), there's a Windows binary và miễn phí (LGPL). Cũng như dòng lệnh, có các ràng buộc cho C, C++, Python, Ruby, Lua, nút, PHP, và các thứ khác.

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