2010-01-13 11 views
7

PHP और GD को imagecreatefrompng() का उपयोग करते समय अल्फा के साथ पीएनजी प्रकार के ग्रेस्केल से छवियां बनाने में परेशानी हो रही है। परिणाम अविश्वसनीय रूप से विकृत हैं।ग्रेस्केल/अल्फा रंग प्रकार के लिए पीएनजी कैसे जांचें?

मैं सोच रहा था कि अगर किसी को असंगतता के उपयोगकर्ता को सूचित करने के लिए रंग के प्रकार की जांच करने का कोई तरीका पता था?

उदाहरण:

मूल छवि: http://dl.dropbox.com/u/246391/Robin.png
परिणामस्वरूप छवि: http://dl.dropbox.com/u/246391/Robin_result.png

कोड:

<?php 

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

चीयर्स,

एरन

+0

विकृत द्वारा आपका क्या मतलब है? अल्फा पारदर्शिता को संरक्षित करने के लिए आपको कुछ कदम उठाने की आवश्यकता है। लेकिन ग्रेस्केल मुद्दे ... यह मेरे लिए नया है –

+0

मैंने एक उदाहरण छवि शामिल करने के लिए अपना उदाहरण अपडेट किया है। अल्फा पारदर्शिता को संरक्षित करना ठीक है। यह विशेष रूप से ग्रेस्केल छवियों के साथ पारदर्शिता है कि जीडी संभाल नहीं सकता है, नीचे हैम evgi के जवाब देखें। – ac94

उत्तर

8

एक PNG छवि के रंग प्रकार बाइट में संग्रहीत किया जाता है फ़ाइल में 25 ऑफसेट (0 से बढ़ रहा है)। आप PNG फ़ाइल की वास्तविक बाइट्स की पकड़ प्राप्त कर सकते हैं तो अगर, बस बाइट 25 को देखो (मैं PHP ऐसा नहीं करते हैं, तो मैं ऐसा करने के लिए कैसे पता नहीं है):

  • 0 - ग्रेस्केल
  • 2 - आरजीबी
  • 3 - आरजीबी पट्टी
  • 4 के साथ - ग्रेस्केल + अल्फा
  • 6 - RGB + अल्फ़ा

पूर्ववर्ती बाइट (ऑफसेट 24) प्रति चैनल बिट्स की संख्या देता है। अधिक जानकारी के लिए the PNG spec देखें।

थोड़ा मोड़ में एक पीएनजी फ़ाइल में टीआरएनएस खंड (जब यह रंग प्रकार 0 2 या 3 होता है) होकर "1-बिट अल्फा" (जीआईएफ की तरह) हो सकता है।

+0

यह सही है, धन्यवाद! – ac94

0

ImageCreateFromPng का उपयोग करने वालों के लिए एक और

उपयोगी टिप्पणी: PHP और जी.डी. ग्रेस्केल/अल्फा छवियों को पहचान नहीं इस जवाब देखते हैं।

तो यदि आप 0% और 100% के बीच पारदर्शिता के साथ ग्रेस्केल छवियों का उपयोग करते हैं, तो छवि को आरजीबी के रूप में सहेजें।

कम से कम यह PHP संस्करण 4.4.2-1 और 5.1.2-1 के लिए जीआईएमपी 2.2.8 के साथ चित्रों के साथ सच है।

यूआरएल: http://php.net/manual/en/function.imagecreatefrompng.php

+0

धन्यवाद, हालांकि मैं यह पता लगाने का एक तरीका ढूंढ रहा हूं कि छवि 'imagecreatefrompng() 'के साथ संसाधन बनाने की कोशिश करने से पहले पारदर्शिता के साथ ग्रेस्केल है। छवियों को साइट पर सबमिट किया गया है, इसलिए दुर्भाग्यवश मेरे पास आरबीजी के रूप में छवि को फिर से सहेजने का कोई तरीका नहीं है (कम से कम मुझे किसी विधि से अवगत नहीं है)। – ac94

4

मैं आज यहाँ उतरा खोज के लिए एक रास्ता (php के माध्यम से) बताने के लिए अगर एक विशिष्ट .png छवि है एक अल्फा png एक - सही दिशा को
डेविड जोन्स 'जवाब अंक, वास्तव में php में लागू करना आसान:

file_get_contents केवल 25 'बाइट लोड करने के लिए (वास्तव में, वास्तव में!), और
ord() अपने ASCII मूल्य प्राप्त करने के लिए, यह ('6' मेरे मामले में के खिलाफ)

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

वास्तव में मैं जरूरत परीक्षण करने के लिए है कि सेमी-उपयोगकर्ता भीतर IE6 साथ पश्चगामी संगतता सुनिश्चित करने के लिए -generated-पृष्ठों, इनलाइन-ब्लॉक के साथ सभी अल्फा png < img> टैग को बदलने के लिए < फैला> - अल्फा PNG फ़ाइल तो एमएस मालिकाना सीएसएस संपत्ति फिल्टर के लिए चर के रूप में परोसा जाएगा

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

... और यह सब काम करता है, इसलिए धन्यवाद!

पाओलो

+0

'(बूल) (ord (file_get_contents ($ alpha_png_candidate, NULL, NULL, 25, 1)) और 4) का उपयोग करके 'इसके बजाय आपको बताएगा कि क्या कोई अल्फा चैनल है या नहीं, चाहे छवि ग्रेस्केल या आरजीबी है या नहीं। – Walf

संबंधित मुद्दे