2010-11-01 24 views
5

Tôi đang sử dụng đoạn mã này để nạp tập tin hình ảnh khác nhau:WPF BitmapImage và TIFF với CMYK + Alpha

BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new System.Uri (path); 
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
bitmap.EndInit(); 

này hoạt động tốt cho các tập tin TIFF lưu trữ như RGB, RGB + Alpha và CMYK. Tuy nhiên, nếu tôi cố tải một tệp TIFF bằng cách sử dụng các màu CMYK và kênh alpha, tôi nhận được một ngoại lệ (định dạng tệp không được nhận dạng là hợp lệ bởi bộ giải mã).

Tôi trước đây đã sử dụng thư viện FreeImage và trình bao bọc C# mỏng trên đầu trang của nó. FreeImage 3.x có hỗ trợ một phần cho loại định dạng hình ảnh này, tức là tôi phải tải TIFF hai lần, một khi là CMYK không có độ trong suốt và một lần là RGB + Alpha; thủ thuật này là cần thiết vì FreeImage chỉ cho phép truy cập tối đa 4 kênh màu đồng thời.

Tôi muốn biết liệu có cách nào được hỗ trợ để tải bitmap CMYK + Alpha không? Hoặc là trực tiếp trong C# hoặc bằng cách đi qua một số mã interop, nhưng tốt nhất là không cần phải sử dụng một bên thứ ba DLL (khác với các thư viện khuôn khổ .NET 4).

Ví dụ về tệp TIFF như vậy có thể được tìm thấy here.

EDIT: Tôi không còn có thể tạo lại vấn đề, đoạn code sau làm việc tốt:

BitmapImage bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.UriSource = new System.Uri (path); 
bitmap.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
bitmap.EndInit(); 
byte[] pixels = new byte[bitmap.PixelHeight*bitmap.PixelWidth*5]; 
bitmap.CopyPixels (pixels, bitmap.PixelWidth * 5, 0); 

Nhưng tôi vẫn còn bị mắc kẹt: làm thế nào tôi có thể tìm ra rằng hình ảnh nguồn được mã hóa như CMYK cộng Kênh Alpha? Khi xem xét thuộc tính Format, tôi chỉ nhận được thông tin rằng hình ảnh có 40 bit trên mỗi pixel. Tất cả nội dung thú vị được lưu trữ trong các thuộc tính không công khai sau:

bitmap.Format.FormatFlags == IsCMYK | NChannelAlpha; 
bitmap.Format.HasAlpha == true; 

Có cách nào chính thức để nhận được chúng, mà không phải phản ánh?

+0

Bạn có bất kỳ liên kết nào đến TIFF sử dụng CMYK với kênh alpha nơi sự cố này xảy ra không? Tôi không thể tạo lại số này –

+0

Tôi đã thêm một liên kết tới hình ảnh TIFF của tôi trong câu hỏi (http://www.opac.ch/files/cmyka.tif) –

+0

Ah, bạn nói đúng. Xin lỗi, hoàn toàn bỏ lỡ nó .. –

Trả lời

0

Tôi chỉ có thể nói điều này vì tôi đã gặp sự cố với một số tệp: đó có thể là cách tốt hơn để chuyển đổi tiff thành png24 trước và sau đó tải nó lên.

Thậm chí Photoshop cũng đưa ra cảnh báo nếu người dùng cố gắng lưu tệp CMYK Tiff và chọn 'Minh bạch': "Nhiều chương trình không hỗ trợ tính minh bạch trong TIFF. Lưu thông tin minh bạch?"

Vì vậy, chuyển đổi trước khi mở có thể là cách an toàn để đi.

Có lẽ http://msdn.microsoft.com/en-us/library/system.drawing.imageconverter.aspx sẽ làm điều đó nhưng tôi nghi ngờ điều đó, bạn có thể cần thêm một số đường ống.

HTH.

+0

Việc chuyển đổi hình ảnh không hoạt động (công cụ chuyển đổi hình ảnh dường như không hỗ trợ hình ảnh kênh CMYK + alpha của tôi). Và tôi không muốn chuyển đổi sang RGB trước, vì tôi thực sự cần truy cập tất cả năm thành phần cho mỗi pixel (Cyan, Magenta, Yellow, Black và Alpha). –

+0

@ kyle: Tôi đã nhầm lẫn, mã hoạt động. Tôi không biết tại sao trước đây tôi lại bị ngoại lệ. –

+0

Rất vui khi được nghe. Tốt cũ xây dựng lại tất cả. – keyle

0

Chỉ là phỏng đoán, nhưng GDI + có thể tải các tệp như vậy.

System.Drawing.Image, vv

Có một lớp Interop mà có thể làm cho GDI + hình ảnh trong WPF.

+0

Tôi chưa tìm thấy cách làm điều đó. Từ những gì tôi hiểu, GDI + luôn trả về giá trị RGB cho tôi và không có cách nào để có được các giá trị CMYK gốc. Hoặc là tôi sai? –

+0

Thực ra tôi không biết. Tôi chỉ sử dụng aaproach này để có được hình ảnh từ TWAIN và dislay chúng trong WPF. –

0

tôi tìm thấy một câu hỏi về SO mà liên quan đến thư viện này:

http://freeimage.sourceforge.net/

Good Tiff library for .NET

Tôi hy vọng điều này có thể giúp đỡ.

+1

Cảm ơn bạn, nhưng tôi đã đến từ FreeImage và tôi không muốn quay trở lại đó; Tôi đã có quá nhiều vấn đề khi bộ nhớ đã xuống thấp. Tôi quan sát thấy nhiều sự cố trong ứng dụng của tôi khi gọi FreeImage, hầu hết có thể do tham nhũng bộ nhớ gây ra. Nhưng libtiff.net có vẻ là một lựa chọn thú vị. –