2010-01-13 5 views
7

PHP und GD scheinen Probleme bei der Erstellung von Bildern aus PNGs vom Typ Graustufen mit Alpha bei der Verwendung imagecreatefrompng() zu haben. Die Ergebnisse sind unglaublich verzerrt.Wie überprüft man ein PNG für Graustufen/Alphakolorit?

Ich fragte mich, ob jemand wusste, wie man den Farbtyp testen könnte, um den Benutzer über die Inkompatibilität zu informieren?

Beispiel:

Originalbild: http://dl.dropbox.com/u/246391/Robin.png
resultierende Bild: http://dl.dropbox.com/u/246391/Robin_result.png

Code:

<?php 

$resource = imagecreatefrompng('./Robin.png'); 
header('Content-type: image/png'); 
imagepng($resource); 
imagedestroy($resource); 

Cheers,

Aron

+0

Was meinst du mit verzerrt? Es gibt bestimmte Schritte, die Sie ergreifen müssen, um Alpha-Transparenz zu erhalten. Aber Graustufenprobleme ... das ist neu für mich –

+0

Ich habe mein Beispiel aktualisiert, um ein Beispielbild aufzunehmen. Die Erhaltung der Alpha-Transparenz ist in Ordnung. Es sind speziell Graustufenbilder mit Transparenz, die GD nicht verarbeiten kann, siehe unten die Antwort von haim evgi. – ac94

Antwort

8

der Farbtyp eines PNG-Bild bei Byte gespeichert Offset 25 in der Datei (von 0 zu zählen). Also, wenn Sie halten den tatsächlichen Bytes der PNG-Datei bekommen, schauen Sie einfach auf Byte 25 (ich weiß nicht PHP tun, so dass ich weiß nicht, wie das zu tun):

  • 0 - Graustufen-
  • 2 - RGB
  • 3 - RGB mit Palette
  • 4 - Graustufen- + alpha
  • 6 - RGB + alpha

die vorangehenden Byte (Offset 24) die Anzahl der Bits pro Kanal ergibt. Weitere Informationen finden Sie unter the PNG spec.

In einer leichten Wendung kann eine PNG-Datei "1-Bit-Alpha" (wie GIFs) haben, indem ein tRNS-Chunk (wenn es Farbtyp 0 2 oder 3 ist).

+0

Das ist perfekt, danke! – ac94

0

Siehe diese Antwort :

Eine weitere nützliche Anmerkung für diejenigen, die ImageCreateFromPng verwenden: PHP und GD erkennen Graustufen/Alphabilder nicht.

Wenn Sie also Graustufenbilder mit einer Transparenz zwischen 0% und 100% verwenden, speichern Sie das Bild als RGB.

Zumindest gilt dies für PHP Version 4.4.2-1 und in 5.1.2-1 mit Bildern aus GIMP 2.2.8.

url: http://php.net/manual/en/function.imagecreatefrompng.php

+0

Danke, aber ich suche nach einer Möglichkeit zu erkennen, dass das Bild Graustufen mit Transparenz ist, bevor Sie versuchen, die Ressource mit 'imagecreatefrompng()' zu erstellen. Die Bilder werden auf der Website eingereicht, so habe ich leider keine Möglichkeit, das Bild als RBG erneut zu speichern (zumindest kenne ich keine Methode). – ac94

4

ich hier gelandet heute die Suche nach einem Weg (via PHP) zu sagen, ob eine bestimmte .png Bild ist ein Alpha-png ein -
David Jones' Antwort Punkte in der richtigen Richtung, einfach in PHP zu implementieren:

file_get_contents nur dieses 25 'Byte laden (da ist es ja!) Und
ord() seinen ASCII-Wert zu erhalten, um es zu testen (gegen '6' in meinem Fall)

if(ord(file_get_contents($alpha_png_candidate, NULL, NULL, 25, 1)) == 6) { 
    is_alpha_png_so_do_something(); 
    } 

ich brauchte eigentlich, dass zur Sicherstellung der Abwärtskompatibilität mit IE6 innerhalb cms-user -Generated-Seiten, ersetzen all alpha-png < img> -Tags mit inline-block < Spannweiten> - die alpha-pNG-Datei wird dann als Variable für die ms-proprietäre CSS-Eigenschaft Filter serviert

.alpha_png_span{ 
    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
    src='$alpha_png_candidate', sizingMethod='crop') 
    } 

... und alles funktioniert, also danke!

paolo

+0

Mit '(bool) (ord (file_get_contents ($ alpha_png_candidate, NULL, NULL, 25, 1)) & 4)' wird Ihnen stattdessen sagen, ob es einen Alpha-Kanal gibt, unabhängig davon, ob das Bild Graustufen oder rgb ist. – Walf