2009-02-26 14 views
18

Dường như .NET không thể mở tệp JP2 (Jpeg 2000) bằng thư viện GDI. Tôi đã tìm kiếm trên google nhưng không thể tìm thấy bất kỳ thư viện hoặc mã ví dụ nào để thực hiện việc này.Hỗ trợ JPEG 2000 trong C# .NET

Bất kỳ ai có ý tưởng nào? Tôi thực sự không muốn trả tiền cho một thư viện để làm điều đó trừ khi tôi phải ..

Trả lời

20

Có vẻ như chúng ta có thể làm điều đó bằng FreeImage (đó là miễn phí)

FIBITMAP dib = FreeImage.LoadEx("test.jp2"); 
//save the image out to disk  
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib, "test.jpg", FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYNORMAL); 
//or even turn it into a normal Bitmap for later use 
Bitmap bitmap = FreeImage.GetBitmap(dib); 
+0

cảm ơn đã hướng dẫn tôi. 1 cho câu trả lời ur. Nhưng sau khi render hình ảnh jpeg200 trên cửa sổ của tôi, tôi nhận được ngoại lệ do dib là null. ** Một ngoại lệ được ném vào đường dẫn rendering. ---> System.ArgumentNullException: Giá trị không được rỗng. Tên tham số: dib tại FreeImageAPI.FreeImage.GetBitmap (FIBITMAP dib, Boolean copyMetadata) tại FreeImageAPI.FreeImage.GetBitmap (FIBITMAP dib) **. Trong khi gỡ lỗi, phát hiện ra rằng phương pháp ** tĩnh FIBITMAP LoadEx (chuỗi tên tập tin, FREE_IMAGE_LOAD_FLAGS cờ, ref FREE_IMAGE_FORMAT định dạng) ** trả về cho tôi một cấu trúc {0} gây ra ngoại lệ trên. –

+1

Tôi nhận được một ngoại lệ mô-đun không tìm thấy với gói nuget FreeImage mới nhất – jjxtra

2

Có lẽ bạn nên thanh toán dự án this.

+2

này dựa trên J # mà không phải là trong Visual Studio 2008 + – jjxtra

2

Tôi đang tìm kiếm thứ gì đó tương tự trong khi quay lại, với quan điểm để triển khai một cái nếu tôi có thể; responses to my question ngụ ý rằng không có phương pháp được ghi lại là để thực hiện việc này cho GDI + mà lớp Hình ảnh trong .Net sử dụng.

Tôi tin rằng nếu bạn đang viết một ứng dụng WPF, sau đó bạn có thể mở rộng danh sách các định dạng ảnh được hỗ trợ thông qua Windows Imanging Components codecs, và có thể là một ngoài kia đã (yêu cầu công cụ tìm kiếm thân thiện với địa phương của bạn?)

Có một tùy chọn để sử dụng một chương trình bổ trợ như DotImage hỗ trợ JPEG2000, mặc dù có thể có nhiều "nỗ lực" hơn trong việc tải hình ảnh.

2

Tôi đã sử dụng Leadtools để hiển thị hình ảnh JPEG 2000. Chúng cung cấp một thư viện .NET bao gồm các điều khiển WPF và WinForms để hiển thị các hình ảnh. Tuy nhiên, có một mức giá hợp lý dốc.

1

Đối với bất cứ ai đến xem qua bài đăng cũ này, các mã trên từ Gordon hoạt động tuyệt vời, nhưng như jixtra chỉ ra, bạn sẽ thực sự có được một ngoại lệ: System.DllNotFoundException: 'Không thể tải DLL' FreeImage ': Không tìm thấy mô-đun được chỉ định.' khi cài đặt qua nuget. Tôi đã có thể làm cho nó hoạt động trong. 4.6.1 bằng cách cài đặt gói nuget FreeImage-dotnet-core và tự thêm FreeImage.dll vào thư mục bin. Bạn có thể tải dll tại đây: http://freeimage.sourceforge.net/download.html.

tôi cần một hình ảnh chất lượng tốt hơn để sử dụng với Tesseract vì vậy tôi thực hiện một vài thay đổi nhỏ khiến một sự khác biệt rất lớn đến chất lượng của các jpeg mới:

var jp2Format = FREE_IMAGE_FORMAT.FIF_JP2; 
var dib = FreeImage.LoadEx("test.jp2", ref jp2Format); 

FreeImage.SetResolutionX(dib, 300); 
FreeImage.SetResolutionY(dib, 300); 
FreeImage.Save(FREE_IMAGE_FORMAT.FIF_JPEG, dib, "test.jpg", FREE_IMAGE_SAVE_FLAGS.JPEG_QUALITYSUPERB);