2010-08-04 71 views
8

Tôi đang sử dụng thư viện có tên EXIFextractor để trích xuất thông tin siêu dữ liệu từ hình ảnh. Phần lib này đang sử dụng System.Drawing.Imaging.PropertyItem để thực hiện tất cả công việc khó khăn. Một số dữ liệu trong PropertyItem, chẳng hạn như Image Details etcetera, được tìm nạp dưới dạng chuỗi ASCII được lưu trữ trong một byte [] theo tài liệu của Microsoft.C#: Chuyển đổi byte [] thành chuỗi được mã hóa UTF8

Vấn đề của tôi là các ký tự quốc tế (å, ä, ö, etcetera) bị loại bỏ và được thay thế bằng dấu chấm hỏi. Khi tôi gỡ lỗi mã, rõ ràng là byte [] là biểu diễn của một UTF-8.

Tôi muốn phân tích cú pháp byte [] dưới dạng chuỗi UTF8, làm cách nào tôi có thể thực hiện việc này mà không mất bất kỳ thông tin nào trong quá trình này?

Cảm ơn trước!


Cập nhật:

Tôi đã được yêu cầu cung cấp một đoạn mã từ mã của tôi:

Đoạn đầu tiên là từ lớp tôi sử dụng, cụ thể là EXIFextractor.cs được viết bởi Asim Goheer

foreach(System.Drawing.Imaging.PropertyItem p in parr) 
{ 
string v = ""; 

       // ... 

else if(p.Type == 0x2) 
{ 
    // string  
    v = ascii.GetString(p.Value); 
} 

Và đây là mã của tôi nơi tôi cố gắng hết sức để xử lý t anh ấy kết quả ở trên.

   try { 
    EXIFextractor exif = new EXIFextractor(ref bmp, ""); 
    object o; 
        if ((o = exif["Image Description"]) != null) 
         MediaFile.Description = Tools.UTF8Encode(o.ToString()); 

Tôi cũng đã thử một số cách khác để nhận dữ liệu quý giá của tôi, nhưng không có gì có thể làm được. Tôi bắt đầu nghĩ Hans Passant đúng về những kết luận của anh ta trong câu trả lời dưới đây.

+0

Nếu thông tin được đọc bằng cách sử dụng mã hóa ASCII, mọi ký tự không phải ASCII sẽ không được đọc chính xác như một hệ quả. Việc đọc các ký tự này bằng cách mã hóa và sau đó ghi vào một mảng byte không đúng. Bạn có thể liên kết đến tài liệu nêu rõ trường hợp này không? –

+1

Đây là, nếu tôi được phép đăng một siêu liên kết khác :) http://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.type.aspx – dotmartin

Trả lời

32
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray); 
+1

Cảm ơn câu trả lời nhanh chóng. Tuy nhiên tôi đã thử điều này. Không may mắn. Tôi bắt đầu tự hỏi liệu các nguồn (tệp hình ảnh) có được mã hóa chính xác ngay từ đầu hay không. – dotmartin

+0

Nếu bạn có thể chia sẻ một ví dụ, chúng tôi có thể tự mình kiểm tra hoặc thử. – Scoregraphic

+1

Tất nhiên. Kể từ khi tôi mới ở đây, tôi sẽ cung cấp cho nó như là một câu trả lời hoặc trong một bình luận hoặc cách ưa thích để làm điều này là gì? – dotmartin

1

Có thể bạn có thể thử mã hóa khác? UTF16, Unicode? Nếu bạn không chắc chắn nếu nó có mã hóa ngay tại địa điểm đầu tiên, hãy thử xem siêu dữ liệu exif bằng một trình đọc exif khác.

2

Có, đây là sự cố với ứng dụng hoặc máy ảnh có nguồn gốc hình ảnh. Tiêu chuẩn EXIF ​​có hỗ trợ khủng khiếp cho văn bản, nó phải được mã hóa bằng ASCII. Điều đó chỉ diễn ra tốt đẹp khi nhiếp ảnh gia nói tiếng Anh. Không nghi ngờ gì về phần mềm mã hóa hình ảnh là bỏ qua yêu cầu này. Đó là những gì lớp PropertyItem đang làm là tốt, nó mã hóa một chuỗi thành byte [] với Marshal.StringToHGlobalAnsi(), nó giả định trang mã mặc định của hệ thống.

Không có cách khắc phục rõ ràng cho điều này, bạn sẽ nhận được mojibake khi ảnh được chụp quá xa máy của bạn.

+1

Đây là những gì tôi mong đợi. Bao giờ tôi vẫn hy vọng rằng Photoshop và công cụ được xây dựng trong XMP sẽ có thể nhận được những điều thẳng. Có bất kỳ đề xuất nào về những gì người ta có thể làm để giải quyết vấn đề không? Công ty của tôi có rất nhiều tệp có mã hóa không tốt nên bộ xử lý hàng loạt sẽ được ưu tiên hơn. – dotmartin

+0

Có đúng là trong byte-array, tất cả các byte đều đúng theo ngôn ngữ của bạn? Nếu có, bạn có thể thử mã hóa/giải mã bằng ngôn ngữ của bạn thay vì UTF8/ascii. Xem http://msdn.microsoft.com/en-us/library/system.text.encoding.getencoding.aspx – Scoregraphic

+0

Không may mắn. Tôi vẫn nhận được dấu hỏi. – dotmartin

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