2010-04-02 19 views
16

PNG görüntüsünün saydam özelliklerinin olup olmadığını hızlı bir şekilde anlamanın bir yolunu arıyorum. Yani, görüntünün herhangi bir kısmı saydam mı, yoksa arka planı herhangi bir şekilde mi göstersin. Bunu anlamanın basit bir yolu bilen var mı?PNG görüntü dosyasının Saydam bir görüntü olup olmadığını tespit etme?

GÜNCELLEME: Tamam, daha sonra PNG belirtimini ve hack kodunu çıkarmak için daha az karmaşık bir yol var mı?

+1

Tam olarak ne arıyorsun? Bir alfa kanalı varlığı? 8 bitlik bir PNG paletinde şeffaf bir rengin beyanı? Tamamen şeffaf piksellerin varlığı? Yarı saydam pikseller ve palet girdileri nedir? –

+0

PNG görüntüsünün, görüntünün herhangi bir bölümünü yarı saydam hale getirip getirmediğini ve arka planı herhangi bir şekilde görüntüleyip görüntülemediğini belirlemek istiyorum. – kenny

cevap

16

Görüntüdeki tüm piksellerden neden geçip alfa değerleri kontrol edilmiyor?

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

GetPixel'i kullanmanın acımasızca yavaş olduğunu unutmayın. Görüntü verisine bir işaretçi almak için Bitmap.LockBits yöntemini kullanmalı ve görüntüyü işlemek için güvenli olmayan kod kullanmalısınız. GetPixel yöntemi görüntü bitlerini kilitler, piksel verilerini alır, bir Renk yapısı oluşturur, sonra her çağrıldığında görüntü bitlerinin kilidini açar ve daha fazla işlem süresi gerektirir. – jrista

+0

Her pikseli kontrol etmekten biraz daha hızlı bir şey bekledim. Ancak RTM'den kesinlikle daha kolay. Bu kaba kuvvet kontrolü için zamanım olup olmadığına karar vermek zorundayım. Teşekkürler. – kenny

+0

Döngü içinden doğru olarak dönmek daha etkili olur, bu nedenle ilk piksel şeffaf olduğunda hemen çıkar. –

4

Eh, ben hala tam olarak soruyu anlamadım, ama sadece kontrol etmek istiyorsanız, belirli bir görüntü şeffaflık özelliklerini kullanabilir, ister bu kodu kullanabilirsiniz:

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

karşın, yine de Belirli bir png dosyasının aslında şeffaf özellikleri kullanıp kullanmadığını belirlemenize yardımcı olmayacaktır, png dosya belirtimine göre renk 4 veya 6 (her ikisi de destek şeffaflığı) olduğunu gösterir.

+0

Teşekkürler, ama bu benim için yararlı değil çünkü içerdiği görüntünün gerçekten yarı saydam olup olmadığını bilmem gerekiyor. Yukarıdaki diğer cevaplar işe yarıyor, ama daha hızlı bir şey için umuyordum ki, bu açıkça ... – kenny

+1

Bu oldukça kullanışlıdır. Yukarıdaki kodla birlikte kullanıyorum, böylece yalnızca saydamlığı destekleyen görüntülerin piksellerini inceliyorum. –

+0

@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ – Kornel

1

İşte etkili bir yaklaşım: PNG'yi ikili olarak açın. Bayt 26'ya (sıfırdan sayıyorsa 25) arama yapın. char: 2 veya alt => kesinlikle opak, 3 veya daha yüksek bir değerin byte değerini değerlendirin => saydamlığı destekler. Bulgularıma göre, Photoshop tarafından oluşturulan dosyalar, gerektiğinde bunu söylemenin güvenilir bir yolu haline getirmek için yalnızca 3 veya daha fazla kullanın. Neredeyse tüm dosyaların opak için 2 ve alfa harmanlanmış için 6 tane olduğu görülmektedir. Ayrıca, kodunuzu aldatmak için o genel alanda bulunan PNG ve IHDR dizelerini de kontrol etmeyi düşünebilirsiniz.

+0

Paletli görüntüler için bunu yapmanın bir yolu yok gibi görünüyor; gimp görüntüyü tamamen opak olarak görse bile orada "3" var. – Nyerguds

+0

Bu yöntem yalnızca opak yanıt için olumludur. Aksi takdirde, tüm resmi kontrol etmeniz gerekir. Gereksiz yanlış pozitiflere gelince, kaç GIF’in şeffaf bitlerin sebepsiz olarak ayarlandığını görmek dehşete düşer. Geçtiğimiz günlerde web galerisinde GIF şeffaflık tanıma efektlerini güzel bir şekilde oluşturmak için kod yazdım.Sonra bu resimleri yapan aptal yazılımın neden olduğu birçok yanlış pozitif vardı. Dosyaları bir hex editöründe (yeniden sıkıştırmak istemedim) düzenledim ve düzeltdim. – Zdenek

+0

BTW, paletli PNG'leri kullanmayı düşünün. İndeksli modda zayıf sıkıştırma performansına sahiptirler. – Zdenek

İlgili konular