2010-04-02 73 views
16

Tôi đang tìm cách để nhanh chóng xác định xem hình ảnh PNG có các tính năng trong suốt hay không. Đó là, cho dù bất kỳ phần nào của hình ảnh mờ hoặc hiển thị nền theo bất kỳ cách nào. Có ai biết một cách đơn giản để phát hiện điều này?Phát hiện xem tệp hình ảnh PNG có phải là hình ảnh trong suốt không?

CẬP NHẬT: OK, có cách nào ít phức tạp hơn để rút ra thông số kỹ thuật PNG và mã hack không?

+1

Chính xác những gì bạn đang tìm kiếm? Sự hiện diện của một kênh alpha? Việc khai báo màu trong suốt trong bảng màu PNG 8 bit? Sự hiện diện của các pixel hoàn toàn trong suốt? Điều gì về pixel trong suốt bán và các mục bảng màu? –

+0

Tôi đang tìm cách xác định xem có bất kỳ khía cạnh nào của hình ảnh PNG làm cho bất kỳ phần nào của hình ảnh mờ và hiển thị nền theo bất kỳ cách nào hay không. – kenny

Trả lời

16

Tại sao không chỉ lặp qua tất cả các pixel trong hình ảnh và kiểm tra giá trị alpha của chúng?

bool ContainsTransparent(Bitmap image) 
    { 
     for (int y = 0; y < image.Height; ++y) 
     { 
      for (int x = 0; x < image.Width; ++x) 
      { 
       if (image.GetPixel(x, y).A != 255) 
       { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
+11

Hãy nhớ rằng việc sử dụng GetPixel chậm một cách chậm chạp. Bạn nên sử dụng phương thức Bitmap.LockBits để lấy con trỏ đến dữ liệu hình ảnh và sử dụng mã không an toàn để xử lý hình ảnh. Phương pháp GetPixel sẽ khóa các bit hình ảnh, lấy dữ liệu pixel, tạo cấu trúc Màu, sau đó mở khóa các bit hình ảnh mỗi khi được gọi, yêu cầu đơn đặt hàng có thời gian xử lý nhiều hơn. – jrista

+0

Tôi đã hy vọng điều gì đó nhanh hơn một chút so với kiểm tra từng điểm ảnh. Nhưng nó chắc chắn dễ hơn RTM. Tôi sẽ phải quyết định nếu tôi có thời gian để kiểm tra sức mạnh vũ phu đó. Cảm ơn. – kenny

+0

Sẽ hiệu quả hơn khi trả về true từ bên trong vòng lặp, do đó thoát ngay lập tức nếu pixel đầu tiên trong suốt. –

4

Vâng, tôi vẫn không hiểu câu hỏi hoàn toàn, nhưng nếu bạn chỉ muốn kiểm tra, cho dù một hình ảnh nhất định có thể sử dụng tính năng minh bạch, bạn có thể sử dụng mã này:

Image img = Image.FromFile ("...", true); 
if ((img.Flags & 0x2) != 0) 
{ 
} 

Mặc dù nó sẽ không giúp bạn xác định xem một tệp png cụ thể có thực sự sử dụng các tính năng trong suốt hay không, nó sẽ chỉ ra rằng nó có màu 4 hoặc 6 (cả tính minh bạch hỗ trợ) theo đặc tả tệp png.

+0

Cảm ơn, nhưng điều này không hữu ích đối với tôi, vì tôi cần phải biết hình ảnh có chứa thực sự mờ không nếu nó có thể. Câu trả lời khác ở trên công trình, nhưng tôi đã hy vọng cho một cái gì đó nhanh hơn, điều này rõ ràng là .... – kenny

+1

Điều này khá hữu ích. Tôi đã sử dụng nó kết hợp với các mã ở trên vì vậy tôi chỉ kiểm tra các điểm ảnh của hình ảnh có hỗ trợ minh bạch. –

+0

@apathetic PNG với loại màu 3 hỗ trợ độ trong suốt cũng như thông qua đoạn tRNS. – Kornel

1

Đây là cách tiếp cận hiệu quả: Mở PNG ở dạng nhị phân. Tìm kiếm byte 26 (25 nếu đếm từ 0). Đánh giá giá trị byte của char: 2 hoặc thấp hơn => chắc chắn mờ đục, 3 hoặc cao hơn => hỗ trợ độ trong suốt. Theo những phát hiện của tôi, các tệp được tạo bởi Photoshop chỉ sử dụng 3 hoặc cao hơn khi cần thiết, đây là cách đáng tin cậy để biết khi nào sử dụng chúng. Có vẻ như hầu như tất cả các tệp đều có 2 tệp cho mờ và 6 cho kết hợp alpha. Bạn cũng có thể xem xét kiểm tra các chuỗi PNG và IHDR được tìm thấy trong khu vực chung đó để đánh lừa mã của bạn.

+0

Có vẻ như không phải là một cách để làm điều này cho hình ảnh paletted; họ có "3" ở đó ngay cả khi gimp nhìn thấy hình ảnh hoàn toàn mờ đục. – Nyerguds

+0

Phương pháp này chỉ khẳng định cho câu trả lời mờ đục. Nếu không, bạn cần phải kiểm tra toàn bộ hình ảnh. Đối với những mặt tích cực sai không cần thiết, bạn sẽ kinh ngạc khi thấy có bao nhiêu GIF có các bit trong suốt được thiết lập mà không có lý do. Gần đây tôi đã mã hóa nhận dạng minh bạch GIF trong thư viện web của mình để tạo hiệu ứng đẹp mắt.Sau đó, nó đã có rất nhiều sai tích cực gây ra bởi phần mềm ngu ngốc làm cho những hình ảnh. Tôi chỉ chỉnh sửa các tập tin trong một trình soạn thảo hex (không muốn recompress) và cố định nó. – Zdenek

+0

BTW, xem xét lại bằng cách sử dụng các PNG được paletted. Chúng có hiệu năng nén kém ở chế độ được lập chỉ mục. – Zdenek

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