2008-08-28 17 views
90

निम्न PHP कोड स्निपेट ब्राउज़र-अपलोड किए गए पीएनजी को 128x128 में बदलने के लिए जीडी का उपयोग करता है। यह बहुत अच्छा काम करता है, सिवाय इसके कि मूल छवि में पारदर्शी क्षेत्रों को एक ठोस रंग के साथ बदल दिया जा रहा है- मेरे मामले में काला।PHP की GDlib imagecopyresampled का उपयोग करते समय पीएनजी छवि पारदर्शिता संरक्षित की जा सकती है?

भले ही imagesavealpha सेट है, कुछ सही नहीं है।

पुन: चित्रित छवि में पारदर्शिता को संरक्षित करने का सबसे अच्छा तरीका क्या है?

$uploadTempFile = $myField[ 'tmp_name' ] 
list($uploadWidth, $uploadHeight, $uploadType) 
    = getimagesize($uploadTempFile); 

$srcImage = imagecreatefrompng($uploadTempFile);  
imagesavealpha($targetImage, true); 

$targetImage = imagecreatetruecolor(128, 128); 
imagecopyresampled($targetImage, $srcImage, 
        0, 0, 
        0, 0, 
        128, 128, 
        $uploadWidth, $uploadHeight); 

imagepng( $targetImage, 'out.png', 9); 

उत्तर

178
imagealphablending($targetImage, false); 
imagesavealpha($targetImage, true); 

यह मेरे लिए किया था। धन्यवाद ceejayoz।

नोट, लक्ष्य छवि को अल्फा सेटिंग्स की आवश्यकता है, स्रोत छवि नहीं।

संपादित करें: पूर्ण प्रतिस्थापन कोड। नीचे दिए गए उत्तरों और उनकी टिप्पणियां भी देखें। यह किसी भी तरह से सही होने की गारंटी नहीं है, लेकिन उस समय मेरी जरूरतों को पूरा किया।

$uploadTempFile = $myField[ 'tmp_name' ] 
list($uploadWidth, $uploadHeight, $uploadType) 
    = getimagesize($uploadTempFile); 

$srcImage = imagecreatefrompng($uploadTempFile); 

$targetImage = imagecreatetruecolor(128, 128); 
imagealphablending($targetImage, false); 
imagesavealpha($targetImage, true); 

imagecopyresampled($targetImage, $srcImage, 
        0, 0, 
        0, 0, 
        128, 128, 
        $uploadWidth, $uploadHeight); 

imagepng( $targetImage, 'out.png', 9); 
+2

मेरे लिए काम नहीं किया है :( – sandeepKumar

+8

अगर मैं कर सकता तो मैं इस 3 बार ऊपर उठाना चाहूंगा। –

+2

वाह, एक आकर्षण की तरह काम किया धन्यवाद :-) –

9

मेरा मानना ​​है कि इस चाल करना चाहिए:

$srcImage = imagecreatefrompng($uploadTempFile); 
imagealphablending($srcImage, false); 
imagesavealpha($srcImage, true); 

संपादित करें: PHP डॉक्स में किसी का दावा है imagealphablending सच है, झूठी नहीं होना चाहिए। YMMV।

+2

सत्य या गलत के साथ 'imagealphablending' का उपयोग करके मुझे हमेशा एक काला पृष्ठभूमि मिलती है। – aesede

+0

PHP7 - मेरे लिए काम करना – Yehonatan

+0

इसके साथ खेला गया (PHP 7.x): पीएनजी: imagealphablending ($ targetImage, false); // यदि पीएनजी पर सच है: काला पृष्ठभूमि जीआईएफ: imagealphablending ($ targetImage, true); // अगर जीआईएफ पर झूठ है: काला पृष्ठभूमि – Jonny

2

पारदर्शिता बनाए रखने के regrading, तो हाँ अन्य पदों imagesavealpha में कहा गया है पसंद() अल्फा झंडा imagealphablending() और झूठी यह काम नहीं करता पर सेट होना आवश्यक उपयोग करने के लिए सही पर सेट किया जा करने के लिए किया है।

इसके अलावा, मैं अपने कोड में दो नाबालिग बातें देखा:

  1. आप के लिए imagecopyresmapled()
  2. $uploadWidth और $uploadHeight चौड़ाई/ऊंचाई पाने के लिए -1 मूल्य होना चाहिए getimagesize() कॉल करने के लिए की जरूरत नहीं है, के बाद से कॉर्डिनेट 0 पर शुरू होता है और 1 नहीं, इसलिए यह उन्हें खाली पिक्सेल में कॉपी करेगा। इसकी जगह: imagesx($targetImage) - 1 और imagesy($targetImage) - 1, relativily कर :)
21

आप चीजों को इतनी जटिल क्यों कर सकता हूँ चाहिए? निम्नलिखित है जो मैं उपयोग करता हूं और अब तक यह मेरे लिए नौकरी कर चुका है।

$im = ImageCreateFromPNG($source); 
$new_im = imagecreatetruecolor($new_size[0],$new_size[1]); 
imagecolortransparent($new_im, imagecolorallocate($new_im, 0, 0, 0)); 
imagecopyresampled($new_im,$im,0,0,0,0,$new_size[0],$new_size[1],$size[0],$size[1]); 
+0

मेरे लिए खूबसूरती से काम किया .. छोटे एन पूरी तरह से काम करता है .... – user1589754

+0

काम नहीं किया, मुझे अभी भी इस छवि के साथ काली पृष्ठभूमि मिलती है: http://www.seomofo.com/downloads/new-google-logo-knockoff। पीएनजी – aesede

+1

धन्यवाद यह –

4

मुझे लगता है कि इस चाल हो सकती:

$uploadTempFile = $myField[ 'tmp_name' ] 
list($uploadWidth, $uploadHeight, $uploadType) 
    = getimagesize($uploadTempFile); 

$srcImage = imagecreatefrompng($uploadTempFile); 

$targetImage = imagecreatetruecolor(128, 128); 

$transparent = imagecolorallocate($targetImage,0,255,0); 
imagecolortransparent($targetImage,$transparent); 
imagefilledrectangle($targetImage,0,0,127,127,$transparent); 

imagecopyresampled($targetImage, $srcImage, 
        0, 0, 
        0, 0, 
        128, 128, 
        $uploadWidth, $uploadHeight); 

imagepng( $targetImage, 'out.png', 9); 

नकारात्मक पक्ष यह है कि छवि हर 100% हरी पिक्सल हिस्सा निकाल दिया जाएगा है। किसी भी तरह, आशा है कि यह मदद करता है :)

+0

यदि आप एक बेहद बदसूरत रंग पर सेट करते हैं जो लगभग कोई छवि उपयोग नहीं करेगा तो यह बहुत उपयोगी हो सकता है। – Cory

+1

@cory बेहद बदसूरत रंग? –

+1

स्वीकृत उत्तर मेरे लिए काम नहीं करता था। 'Imagecreate (...) 'के साथ इस उत्तर का उपयोग हालांकि काम किया। आप एक छवि बनाते हैं, जो आपके द्वारा आवंटित पहले रंग से भर जाता है। फिर आप उस रंग को पारदर्शी पर सेट करते हैं। यदि लक्ष्य छवि के लिए अल्फाबलिंग को सत्य पर सेट किया गया है, तो दोनों छवियां विलय हो जाएंगी और पारदर्शिता सही तरीके से काम करेगी। – Sumurai8

9

एक अतिरिक्त है कि कुछ लोगों मदद कर सकता है:

यह छवि निर्माण imagealphablending टॉगल करने के लिए संभव है। मैं विशिष्ट मामला जिसकी मुझे आवश्यकता थी, मैं एक पारदर्शी पृष्ठभूमि पर कुछ अर्द्ध पारदर्शी पीएनजी को जोड़ना चाहता था।

सबसे पहले आप झूठी छवियों को झूठ बोलते हैं और नव निर्मित सच्ची रंगीन छवि को पारदर्शी रंग से भरते हैं। अगर imagealphablending सच थे, तो कुछ नहीं होगा क्योंकि पारदर्शी भर काले रंग की पृष्ठभूमि के साथ विलय हो जाएगी और परिणामस्वरूप काला हो जाएगा।

फिर आप छवि को सच्चाई में टॉगल करते हैं और कुछ पीएनजी छवियों को कैनवास में जोड़ते हैं, जिससे कुछ पृष्ठभूमि दिखाई देती है (यानी पूरी छवि को भरना नहीं)।

परिणाम एक पारदर्शी पृष्ठभूमि और कई संयुक्त पीएनजी छवियों के साथ एक छवि है।

+0

इस अतिरिक्त जानकारी को जोड़ने के लिए धन्यवाद। यह मुझे पागल कर रहा था। – zaf

6

मैं copyimageresample साथ जेपीईजी/GIF/PNG तरह छवि का आकार बदलने और PNG छवियों अभी भी वहाँ पारदर्शिता रखने के लिए एक समारोह बना दिया है:

$myfile=$_FILES["youimage"]; 

function ismyimage($myfile) { 
    if((($myfile["type"] == "image/gif") || ($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg") || ($myfile["type"] == "image/png")) && ($myfile["size"] <= 2097152 /*2mb*/)) return true; 
    else return false; 
} 

function upload_file($myfile) {   
    if(ismyimage($myfile)) { 
     $information=getimagesize($myfile["tmp_name"]); 
     $mywidth=$information[0]; 
     $myheight=$information[1]; 

     $newwidth=$mywidth; 
     $newheight=$myheight; 
     while(($newwidth > 600) || ($newheight > 400)) { 
      $newwidth = $newwidth-ceil($newwidth/100); 
      $newheight = $newheight-ceil($newheight/100); 
     } 

     $files=$myfile["name"]; 

     if($myfile["type"] == "image/gif") { 
      $tmp=imagecreatetruecolor($newwidth,$newheight); 
      $src=imagecreatefromgif($myfile["tmp_name"]); 
      imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight); 
      $con=imagegif($tmp, $files); 
      imagedestroy($tmp); 
      imagedestroy($src); 
      if($con){ 
       return true; 
      } else { 
       return false; 
      } 
     } else if(($myfile["type"] == "image/jpg") || ($myfile["type"] == "image/jpeg")) { 
      $tmp=imagecreatetruecolor($newwidth,$newheight); 
      $src=imagecreatefromjpeg($myfile["tmp_name"]); 
      imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight); 
      $con=imagejpeg($tmp, $files); 
      imagedestroy($tmp); 
      imagedestroy($src); 
      if($con) { 
       return true; 
      } else { 
       return false; 
      } 
     } else if($myfile["type"] == "image/png") { 
      $tmp=imagecreatetruecolor($newwidth,$newheight); 
      $src=imagecreatefrompng($myfile["tmp_name"]); 
      imagealphablending($tmp, false); 
      imagesavealpha($tmp,true); 
      $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); 
      imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); 
      imagecopyresampled($tmp, $src, 0, 0, 0, 0, $newwidth, $newheight, $mywidth, $myheight); 
      $con=imagepng($tmp, $files); 
      imagedestroy($tmp); 
      imagedestroy($src); 
      if($con) { 
       return true; 
      } else { 
       return false; 
      } 
     } 
    } else 
      return false; 
} 
+1

प्रश्न में कोड पर इस कोड में पारदर्शिता क्यों संरक्षित की जाती है, यह जानने के लिए सभी कोडों को पढ़ने के लिए यह कठिन है। – eh9

+0

मैंने इन दो पंक्तियों को छोड़ दिया और यह अभी भी काम करता है: '$ पारदर्शी = imagecolorallocatealpha ($ tmp, 255, 255, 255, 127);' 'imagefilledrectangle ($ tmp, 0, 0, $ newwidth, $ newheight, $ पारदर्शी); ' –

0

यहाँ मेरी कुल परीक्षण कोड है। यह जो imagecopyresampled कार्य करने के लिए पारित कर रहे हैं स्रोत छवि के width और height मूल्यों के लिए मुझे

$imageFileType = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); 
$filename = 'test.' . $imageFileType; 
move_uploaded_file($_FILES["image"]["tmp_name"], $filename); 

$source_image = imagecreatefromjpeg($filename); 

$source_imagex = imagesx($source_image); 
$source_imagey = imagesy($source_image); 

$dest_imagex = 400; 
$dest_imagey = 600; 
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey); 

imagecopyresampled($dest_image, $source_image, 0, 0, 0, 0, $dest_imagex, $dest_imagey, $source_imagex, $source_imagey); 

imagesavealpha($dest_image, true); 
$trans_colour = imagecolorallocatealpha($dest_image, 0, 0, 0, 127); 
imagefill($dest_image, 0, 0, $trans_colour); 

imagepng($dest_image,"test1.png",1); 
0

वेतन ध्यान देने के लिए काम करता है। यदि वे वास्तविक स्रोत छवि आकार से बड़े हैं, तो शेष छवि क्षेत्र काला रंग से भरा जाएगा।

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