2009-05-17 35 views
18

Tôi viết một ứng dụng mà cần phải thay đổi kích thước số lượng lớn hình ảnh ... và đây là những yêu cầu của tôi:nhanh nhất C/C++ hình ảnh thay đổi kích thước thư viện

  • C/C++
  • Hỗ trợ jpeg/png ít nhất
  • nhanh
  • Cross-Platform

Cho đến nay lựa chọn của tôi là:

  • OpenCV
  • CImg
  • ImageMagick
  • GraphicsMagick (nó cho là nhanh)
  • quỷ
  • GIL từ Boost
  • CxImage
  • Imlib2 (nó cho là nhanh)
  • Mọi người khác?

Tất cả những sẽ hoàn thành công việc, nhưng tôi đang tìm kiếm các nhanh nhất ở đây, và tôi đã không thể tìm thấy bất kỳ tiêu chí chuẩn về hiệu suất của chúng.

+10

Thay đổi kích thước lớn (ví dụ như trong toàn bộ video tải lên của tháng trước) số lượng hình ảnh giống như một ứng dụng chuyên sâu, vì vậy tôi tự hỏi tại sao nền tảng chéo quan trọng như vậy? Nếu bạn có thể dựa vào phần cứng cụ thể, bạn có lẽ sẽ có thể đi quá nhanh trên phần mở rộng mà bạn sẽ phải nghiêm túc bắt đầu suy nghĩ về cách đọc/ghi tất cả dữ liệu đó đủ nhanh. – Chris

+1

"Tôi không thể tìm thấy điểm chuẩn nào": Bạn luôn có thể đặt chỗ, hòm chúng và sau đó chia sẻ phát hiện của bạn tại đây :-) – lothar

+0

@chris Tôi nhận ra đây là một câu hỏi cũ nhưng với CPU và hình ảnh chung trên máy cục bộ thay đổi kích thước đĩa là gần như chắc chắn sẽ là một vấn đề tính toán ràng buộc. Bây giờ, nếu bạn có nghĩa là chuyên ngành (ví dụ: CUDA) và không phải phần cứng cụ thể bạn _might_ có thể làm cho nó bị ràng buộc IO. – Yaur

Trả lời

13

Hãy xem Intel IPP (Integrated Performance Primitives) (liên kết Wiki tốt hơn sau đó là Intel ...) cũng hoạt động trên AMD và có chức năng thay đổi kích thước hình ảnh (song tuyến, lân cận gần nhất, v.v.) và hoạt động trên Linux và Windows.

Nó không phải là miễn phí (nhưng nó sẽ không phá vỡ ngân hàng), nhưng nó là nhanh nhất mà bạn có thể tìm thấy.

+1

Nếu hình ảnh đã được giải mã, thì IPP là lựa chọn tốt. Tuy nhiên, nó có thể nhanh hơn bằng cách giải mã và mở rộng theo từng bước. Tôi không biết cách sử dụng IPP để thay đổi kích thước mà không cần giải mã bitmap 1: 1 trước. – kcwu

+2

suy nghĩ một chút về câu nói đó. Phần nào của việc thực hiện nó trong một bước đơn (phức tạp) sẽ làm cho nó nhanh hơn? Các thói quen giải mã hình ảnh vẫn cần phải giải mã mọi pixel để bộ lọc thường xuyên lọc chúng. Ngay cả khi thư viện của họ là một thư viện đã thực hiện nó trong một lần - việc đo điểm chuẩn của chúng tôi về các thói quen IPP sẽ chỉ ra một đường chuyền 2 với IPP có lẽ sẽ nhanh hơn. –

+0

có thể bởi vì làm điều đó trong lần 1 vượt qua nó có thể sử dụng dữ liệu đã có trong bộ nhớ cache cpu – CiNN

0

Nếu bạn đang tìm kiếm công cụ miễn phí, và muốn làm mọi thứ nhanh chóng, cố gắng phát triển một plugin Gimp C-biên soạn: đây là rất dễ dàng, và tôi nghĩ rằng Gimp làm một công việc tốt tại resizing:

Đây có thể không phải là nhanh nhất để thay đổi kích thước, nhưng rẻ nhất (miễn phí) và nhanh nhất để phát triển.

Hãy xem there.

+0

Hoặc cách khác, hãy gọi trình chỉnh sửa thông qua plugin Python. –

+0

GIMP là một GUI. Tôi nghĩ rằng câu hỏi là về một thư viện có thể được sử dụng từ C/C++. Tôi biết rằng GIMP có thể được kiểm soát từ các kịch bản, nhưng điều này sẽ không nhanh. – guettli

+0

Bạn có thể nghĩ rằng nó chậm vì phải mất thời gian để khởi động, nhưng thay đổi kích thước bằng GIMP rất nhanh và nếu bạn giữ nó vào bộ nhớ, có thể đây không phải là nhanh nhất, nhưng nó miễn phí ** và ** rất nhanh. Tự kiểm tra, bạn có thể ngạc nhiên;) –

0

Nếu bạn đang tìm kiếm nguồn mở, làm thế nào về FreeImage? Đối với công cụ thương mại, tôi sử dụng Snowbound. Cả hai đều khá nhanh và có khả năng nhiều định dạng hình ảnh khác nhau và các thuật toán thay đổi kích thước.

+1

Giấy phép Công cộng FreeImage không ngăn chặn việc sử dụng thương mại. – darklon

4

@ Chris Becke của bình luận:.?

"nghĩ cho chỉ là một khoảnh khắc về tuyên bố rằng Phần nào để làm việc đó trong một (phức tạp) bước duy nhất là sẽ làm cho nó bất kỳ nhanh Các thói quen hình ảnh giải mã vẫn cần phải giải mã mọi pixel để bộ lọc thường xuyên lọc chúng. "

Điều đó không phải lúc nào cũng như vậy. Ví dụ, khi giải mã một JPEG bạn có thể yêu cầu thư viện JPEG cung cấp cho bạn một hình ảnh kích thước 1/2, 1/4, 1/8 (hoặc một cái gì đó như thế; đó là một lúc kể từ khi tôi đã xem chi tiết) mà nó có thể làm mà không cần phải giải mã chi tiết bổ sung chút nào, do cách hoạt động của JPEG. Nó có thể nhanh hơn nhiều so với quy mô + giải mã đầy đủ.

(Rõ ràng, bạn có thể cần phải mở rộng quy mô một chút sau đó nếu các hình ảnh nhỏ hơn không phải là kích thước chính xác mà bạn muốn).

(Xin lỗi tôi chỉ có thể gửi trả lời này như một bình luận do không reputaton. Lần đầu tiên Tôi đã cố gắng đăng bất kỳ thứ gì ở đây. Nếu ai đó muốn đăng lại hoặc tương tự như nhận xét và xóa câu trả lời của tôi, hãy cảm thấy tự do!)

+0

Có ý nghĩa, thuật toán nhân rộng sẽ cho kết quả tốt hơn với nhiều dữ liệu hơn (chỉ ở một mức độ nhỏ nhất định không quan trọng) nhưng sau đó bạn cần phải làm việc qua tất cả các phương thức nén khác nhau (BMP, GIF, PNG, JPEG) và ghi một phiên bản cụ thể. –

+0

Tôi nghĩ JPEG là định dạng duy nhất có thể được tối ưu hóa theo cách này. Nó được cấu trúc để các mức chi tiết khác nhau có thể được tách ra trước khi giải mã đầy đủ. –

+0

Làm việc theo khối cũng có nghĩa là bạn có thể chồng chéo giải mã và mã hóa lại. Ví dụ, libvips (xem câu trả lời của @ bithive) sẽ truyền hình ảnh, chạy giải mã, xử lý và recode song song. Đối với nhiều hoạt động, giải mã/giải mã là một bước giới hạn tốc độ một luồng, vì vậy điều này có thể tăng tốc độ lớn. – user894763

5

Nếu IPP làm what you need (ví dụ: Thay đổi kích thước trong phần 12), thì tôi nghi ngờ bạn sẽ tìm thấy mã x86 nhanh hơn đáng kể ở bất kỳ nơi nào khác. Hãy nhớ rằng nó có thể rơi trở lại vào "triển khai tham chiếu" chậm hơn khi chạy trên các CPU AMD.

Nếu CPU không đáp ứng yêu cầu hiệu suất của bạn, bạn có thể cân nhắc việc thay đổi kích thước trên GPU bằng cách sử dụng OpenGL (việc triển khai đơn giản nhất bằng cách sử dụng ánh xạ kết cấu sẽ được hưởng lợi từ phần tử nội suy phần cứng, để lọc phức tạp hơn sử dụng mã đổ bóng GLSL). Khả năng của GPU để thực hiện điều này nhanh hơn một trăm lần so với CPU (cho hay lấy số không) phải được cân nhắc đối với việc truyền dữ liệu tương đối chậm đến và đi từ thẻ (thường là một gigabyte hoặc hai giây một giây) Trong phần lớn).

9

Hãy xem VIPS. Đó là một trong những nhanh nhất tôi đã tìm thấy cho đến nay.

+0

Tôi chưa tự sử dụng VIPS. Nhưng nó có vẻ nhanh (và LGPL): http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use – guettli

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