2013-03-23 8 views
10

पर ले जा रहा है मैं PHP जीडी के साथ अवतार बना रहा हूं। अवतार के पैरों और छवि के नीचे के बीच कष्टप्रद जगह है। मैं अवतार को नीचे तक नीचे दबाकर उस स्थान से छुटकारा पाना चाहता हूं (नीचे देखें)।नीचे एक छवि को

enter image description here

वहाँ इस के लिए एक विधि है:

यहाँ मूल छवि है कि मैं पसंद नहीं है, छवि मैं प्राप्त करना चाहते हैं के साथ है? धन्यवाद। छवि उत्पादन के लिए इस्तेमाल किए जा रहे कोड का मुख्य भाग नीचे दिया गया है।

$assets = array(
    "../assets/shirt/Default.png", 
    "../assets/body/Default.png", 
    "../assets/hair/Default.png", 
    "../assets/eyes/Default.png", 
    "../assets/eyebrows/Default.png", 
    "../assets/mouth/Default.png", 
    "../assets/pants/Default.png" 
); 

$baseImage = imagecreatefrompng($assets[0]); 
imagealphablending($baseImage, true); 
imagesavealpha($baseImage, true); 

foreach($assets as $item) { 
    $newImage = imagecreatefrompng($item); 
    imagecopy($baseImage, $newImage, 0, 0, 0, 0, 350, 550); 

    imagealphablending($baseImage, true); 
    imagesavealpha($baseImage, true); 
} 

if($_GET['x']) { 

    $sizex = $_GET['x']; if($sizex > 350) $sizex = 350; 
    $sizey = $_GET['y']; if($sizey > 550) $sizey = 550; 

    $png = imagecreatetruecolor($sizex, $sizey); 
    imagesavealpha($png, true); 

    $trans_colour = imagecolorallocatealpha($png, 0, 0, 0, 127); 
    imagefill($png, 0, 0, $trans_colour); 

    $blankImage = $png; 
    imagealphablending($blankImage, true); 
    imagesavealpha($blankImage, true); 

    imagecopyresampled($blankImage, $baseImage, 0, 0, 0, 0, $sizex, $sizey, 350, 550); 

    header("Content-type: image/png"); 
    imagepng($blankImage); 
} 
else { 
    header("Content-type: image/png"); 
    imagepng($baseImage); 
} 

नोट: उस कोड का if($_GET['x']) { हिस्सा मुझे मौके पर अवतार के विभिन्न आकारों उत्पन्न करने के लिए अनुमति देने के लिए है। यह बढ़िया काम करता है।

+0

यह अपने प्रश्न को समझने के लिए, लेकिन क्यों पिक्सेल पर से प्रचार ऊंचाई को कम नहीं मुश्किल है? –

+0

अद्यतन डब्ल्यू/चित्र और बेहतर स्पष्टीकरण। मैं चीजों को समझाने में भयानक हूं। माफ़ कीजिये। :( – Anonymous

+0

@BenD मैं छवि का आकार बदल नहीं सकता, और यह इस तथ्य के कारण है कि उपयोगकर्ता जूते या कुछ ऐसा सेट जोड़ सकता है जो इस स्थान का उपयोग करेगा। – Anonymous

उत्तर

3

नीचे फसल को फसल करने और फसल की गई छवि को नीचे ले जाने के लिए कोड है।

<?php 
example(); 
function example(){ 
    $img = imagecreatefrompng('http://i.stack.imgur.com/UUiMK.png'); 
    imagealphablending($img, true); 
    imagesavealpha($img, true); 

    // copy cropped portion 
    $img2 = imageCropBottom($img); 

    // output cropped image to the browser 
    header('Content-Type: image/png'); 
    imagepng($img2); 

    imagedestroy($img2); 
} 

function imageCropBottom($image) { 
    $background1 = imagecolorat($image, 0, 0); 
    $background2 = imagecolorat($image, 1, 1); 

    $imageWidth = imageSX($image); 
    $imageHeight = imageSY($image); 
    $bottom = 0; 

    for ($y = $imageHeight ; $y > 0 ; $y--) { 
     for ($x = 0 ; $x < imagesx($image) ; $x++) { 

      $imageColor = imagecolorat($image, $x, $y); 
      if (($imageColor != $background1) && ($imageColor != $background2)) { 
       $bottom = $y; 
       break; 
      } 
     } 
     if ($bottom > 0) break; 
    } 

    $bottom++; 

    // create new image with padding 
    $img = imagecreatetruecolor($imageWidth, $imageHeight); 
    imagealphablending($img, true); 
    imagesavealpha($img, true); 

    $trans_colour = imagecolorallocatealpha($img, 0, 0, 0, 127); 
    imagefill($img, 0, 0, $trans_colour); 

    // copy 
    imagecopy($img, $image, 1, $imageHeight-$bottom, 1, 1, $imageWidth-2, $bottom-1); 

    // Draw a black rectangle 
    $black = imagecolorallocate($img, 0, 0, 0); 
    imagerectangle($img, 0, 0, $imageWidth-1, $imageHeight-1, $black); 


    // destroy old image cursor 
    imagedestroy($image); 
    return $img; 
} 

संदर्भ:

2

मुझे लगता है कि समाधान नीचे के फैशन में अवतार का निर्माण करना है। यानी जूता -> पैंट -> शर्ट -> चेहरा -> बाल

(छद्म कोड)

position = (x,y) // where y is the height of the canvas initially 
if(need(shoe)){ 
    position = position - shoe.height 
    add shoe at position 
} 
if(need(pant)) { 
    position = position - pant.height 
    add pant at position 
} 
... and so on 

आप imagecopy विधि यह निम्न विधि हस्ताक्षर

bool imagecopy (resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h) 

है पर नज़र डालें तो $dst_x और $dst_y बदलकर आप जो वर्णन कर चुके हैं उसे प्राप्त कर सकते हैं।

+0

हालांकि यह परेशान है, क्योंकि जूते अलग-अलग ऊंचाइयों का हो सकता है। इसके लिए कोई सुझाव? – Anonymous

+0

ऊंचाई को गतिशील रूप से ढूंढने या संपत्ति सरणी बदलने के लिए getimagesize() का उपयोग करें नेस्टेड हैश में जिसमें सभी आवश्यक पैरामीटर हैं। – Josnidhin

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