2010-07-21 12 views
5

मुझे छवि स्केलिंग के this discussion द्वारा चिंतित किया गया था और बाद में पता चला कि अपलोड किए गए चित्रों से थंबनेल बनाने के लिए मैं उपयोग कर रहा PHP कोड एक ही समस्या से पीड़ित है। मैंने नीचे दिए गए PHP फिक्स को कोशिश करने का निर्णय लिया (गामा को 2.2 से 1.0 तक परिवर्तित करना, छवि का आकार बदलना, गामा को 1.0 से 2.2 में परिवर्तित करना)। यह लेख में उल्लिखित मुद्दे को हल करने के लिए काम करता है, हालांकि कोड में इस संशोधन में पीएनजी अल्फा चैनल पारदर्शिता को खारिज करने का दुर्भाग्यपूर्ण दुष्प्रभाव है।PHP जीडी 2: अल्फा चैनल पारदर्शिता और सही गामा को बनाए रखने के लिए कैसे करें

यहां कोड में मेरे पास गामा सुधार के साथ कोड है।

<?php 
$image = imagecreatefrompng($source_file); 
$resized_image = imagecreatetruecolor($new_width, $new_height); 
imagealphablending($resized_image, false); 
imagesavealpha($resized_image, true); 
imagegammacorrect($image, 2.2, 1.0); 
imagecopyresampled($resized_image, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height); 
imagegammacorrect($resized_image, 1.0, 2.2); 
imagepng($resized_image, $dest_file); 
?> 

किसी को भी पता है कि छवि का आकार करने के लिए कैसे, गामा सुधार चाल को रोजगार, जबकि मूल छवि की अल्फ़ा चैनल पारदर्शिता को बनाए रखने?

संपादित

नमूना छवियों:

  1. मूल फ़ाइल - पीएनजी अल्फ़ा चैनल पारदर्शिता के साथ
  2. दोनों imagegammacorrect() फ़ंक्शन कॉल दोनों imagegammacorrect साथ
  3. आकृति परिवर्तन फ़ाइल पर टिप्पणी के साथ
  4. आकृति परिवर्तन फ़ाइल() फंक्शन कॉल

आप इसे देख सकते हैं ई पारदर्शिता तब तक ठीक है जब तक आप गामा को सही करने का प्रयास नहीं करते। (पारदर्शिता नीचे काम कर रहा है देखने के लिए सबसे आसान तरीका है पैरा टैग छवियों के चारों ओर लिपटा का निरीक्षण किया और एक पृष्ठभूमि जोड़ने के लिए है:। काले; FireBug या इसी तरह के माध्यम से अपनी शैली विशेषता के लिए)

original image http://ender.hosting.emarketsouth.com/images/test-image.png no gamma correction http://ender.hosting.emarketsouth.com/images/test-image-resized-no-gamma.png gamma corrected - no transparency http://ender.hosting.emarketsouth.com/images/test-image-resized.png

उत्तर

2

यहां कुछ कोड है जो काम करता है। असल में, यह अल्फा चैनल को अलग करता है, गामा सही का उपयोग कर छवि का आकार बदलता है, अल्फा चैनल का आकार गामा सही के बिना बदलता है, फिर अल्फा चैनल पर प्रतिलिपि बनाई गई छवि को प्रतिलिपि बनाई गई छवि के साथ प्रतिलिपि बनाता है।

मेरा अनुमान है कि imagegammacorrect() फ़ंक्शन में एक बग है। शायद गामा केवल आरजीबी पर लागू होता है और जीडी अल्फा चैनल के साथ समान गणना करने की कोशिश करता है? रंग सिद्धांत मेरा फोर्टे नहीं है।

वैसे भी, यहां कोड है। दुर्भाग्य से मुझे पिक्सल पर एक-एक-एक से लूप की तुलना में चैनलों को अलग करने का बेहतर तरीका नहीं मिला। ओह अच्छा ...

<?php 
// Load image 
$image = imagecreatefrompng('test-image.png'); 

// Create destination 
$resized_image = imagecreatetruecolor(100, 100); 
imagealphablending($resized_image, false); // Overwrite alpha 
imagesavealpha($resized_image, true); 

// Create a separate alpha channel 
$alpha_image = imagecreatetruecolor(200, 200); 
imagealphablending($alpha_image, false); // Overwrite alpha 
imagesavealpha($alpha_image, true); 

for ($x = 0; $x < 200; $x++) { 
    for ($y = 0; $y < 200; $y++) { 
     $alpha = (imagecolorat($image, $x, $y) >> 24) & 0xFF; 
     $color = imagecolorallocatealpha($alpha_image, 0, 0, 0, $alpha); 
     imagesetpixel($alpha_image, $x, $y, $color); 
    } 
} 

// Resize image to destination, using gamma correction 
imagegammacorrect($image, 2.2, 1.0); 
imagecopyresampled($resized_image, $image, 0, 0, 0, 0, 100, 100, 200, 200); 
imagegammacorrect($resized_image, 1.0, 2.2); 

// Resize alpha channel 
$alpha_resized_image = imagecreatetruecolor(200, 200); 
imagealphablending($alpha_resized_image, false); 
imagesavealpha($alpha_resized_image, true); 

imagecopyresampled($alpha_resized_image, $alpha_image, 0, 0, 0, 0, 100, 100, 200, 200); 

// Copy alpha channel back to resized image 
for ($x = 0; $x < 100; $x++) { 
    for ($y = 0; $y < 100; $y++) { 
     $alpha = (imagecolorat($alpha_resized_image, $x, $y) >> 24) & 0xFF; 
     $rgb = imagecolorat($resized_image, $x, $y); 
     $r = ($rgb >> 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 
     $color = imagecolorallocatealpha($resized_image, $r, $g, $b, $alpha); 
     imagesetpixel($resized_image, $x, $y, $color); 
    } 
} 

imagepng($resized_image, 'test-image-scaled.png'); 
?> 

निश्चित रूप से चर के साथ हार्ड-कोडेड मूल्यों बदलें ... और यहाँ परिणाम मैं अपनी छवि को और मेरे कोड का उपयोग कर प्राप्त होते हैं:

Resized image http://www.jejik.com/sander/test-image-scaled.png

+0

रोचक, मुझे कार्यालय में वापस आने पर कल के साथ कुछ समय बिताना होगा :) –

+0

को मेरे मौजूदा कोड के साथ इसे गठबंधन करने के लिए थोड़ा सा रिफैक्टरिंग करना था, लेकिन अंत में यह बहुत अच्छा काम करता है। बहुत सराहना की! –

-1

Imagecopyresampled() और पारदर्शिता के साथ एक समस्या है। एक संभावित समाधान के लिए this comment on php.net पर एक नज़र डालें।

+0

नहीं, पारदर्शिता है जब मैं imagegammacorrect() फ़ंक्शन कॉल को हटाता हूं तो किसी भी परेशानी के बिना संरक्षित। http://stackoverflow.com/questions/313070/png-transparency-with-php/313103#313103 उसमें सहायता की। –

+0

आह, तब एक चुनौती! :- डी मेरा नया जवाब देखें। –

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