2009-06-29 26 views
6

Dairesel bir alanı bir görüntü kaynağından diğerine kopyalamanın makul bir yolu var mı? Çevreler veya ovaller vb. Hariç imagecopymerge gibi bir şey var mı?
Mümkünse, önceden oluşturulmuş görüntü dosyalarını kullanmaktan kaçınmak istiyorum (herhangi bir oval şekil mümkün olmalıdır) ve eğer saydam renkler varsa, görüntünün kalan kısmını da doğal olarak bırakmalıdırlar.PHP/GD, bir görüntüyü bir görüntüden diğerine nasıl kopyalayabilirsiniz?

Soruyorum Neden, görüntü işlemlerini görüntünün bir "seçili alanı" içine uygulamanıza izin veren birkaç sınıfa sahibim. Bu, bu alanın ilk önce görüntünün bir kopyasından silinmesi ve ardından kopyaların üst üste gelmesiyle sonuçlanır. orijinalinde. Ama bir dikdörtgen seçmek istiyorsanız ve daha sonra bir çemberin seçimini kaldırmak istiyorsanız ve işlemlerin yalnızca kalan alanı etkilemesini istiyorsanız ne olur?

+0

phalacee cevabı sorununuzu çözdü mü? Bu sayfa bir [güncel soru] ile işaret ediliyor (http://stackoverflow.com/questions/14900727/how-to-cut-a-part-of-the-image-and-paste-it-to-another -using-php), işe yarayıp yaramadığını bilmek güzel olurdu. – halfer

cevap

8

Bu deneyebilirsiniz:

  1. Başlat orijinal görüntü ile - $ img
  2. Kopya bir png o görüntü - $
  3. Eğer daire içinde istediğiniz alanın png resim maske oluşturma kopyalama/elips (alfa şeffaflık rengine siyah seti ile üzerinde siyah bir şekle sahip bir 'magicpink' imaj,) - $ $ üstünden
  4. Kopya $ maskesi maske alfa şeffaflığı
  5. Değiştir koruyarak kopya ne
  6. Kopya $ Alfa şeffaflığı muhafaza $ img üzerinde geri kopyalamak

    // 1. Start with the original image 
    $img = imagecreatefromjpeg("./original.jpg"); 
    $img_magicpink = imagecolorallocatealpha($img, 255, 0, 255, 127); 
    //imagecolortransparent($img, $img_magicpink); 

    // (Get its dimensions for copying) 
    list($w, $h) = getimagesize("./original.jpg"); 

    // 2. Create the first copy 
    $copy = imagecreatefromjpeg("./original.jpg"); 
    imagealphablending($copy, true); 

    $copy_magicpink = imagecolorallocate($copy, 255, 0, 255); 
    imagecolortransparent($copy, $copy_magicpink); 

    // 3. Create the mask 
    $mask = imagecreatetruecolor($w, $h); 
    imagealphablending($mask, true); 

    // 3-1. Set the masking colours 
    $mask_black = imagecolorallocate($mask, 0, 0, 0); 
    $mask_magicpink = imagecolorallocate($mask, 255, 0, 255); 
    imagecolortransparent($mask, $mask_black); 
    imagefill($mask, 0, 0, $mask_magicpink); 

    // 3-2. Draw the circle for the mask 
    $circle_x = $w/2; 
    $circle_y = $h/2; 
    $circle_w = 150; 
    $circle_h = 150; 
    imagefilledellipse($mask, $circle_x, $circle_y, $circle_w, $circle_h, $mask_black); 

    // 4. Copy the mask over the top of the copied image, and apply the mask as an alpha layer 
    imagecopymerge($copy, $mask, 0, 0, 0, 0, $w, $h, 100); 


    // 5. Do what you need to do to the image area 
    // My example is turning the original image gray and leaving the masked area as colour 
    $x = imagesx($img); 
    $y = imagesy($img); 
    $gray = imagecreatetruecolor($x, $y); 
    imagecolorallocate($gray, 0, 0, 0); 
    for ($i = 0; $i > 16) & 0xFF; 
     $g = ($rgb >> 8) & 0xFF; 
     $b = $rgb & 0xFF; 
     //for gray mode $r = $g = $b 
     $color = max(array($r, $g, $b)); 
     $gray_color = imagecolorexact($img, $color, $color, $color); 
     imagesetpixel($gray, $i, $j, $gray_color); 
     } 
    } 

    // 6. Merge the copy with the origianl - maintaining alpha 
    imagecopymergegray($gray, $copy, 0, 0, 0, 0, $w, $h, 100); 
    imagealphablending($gray, true); 
    imagecolortransparent($gray, $mask_magicpink); 

    header('Content-Type: image/png'); 
    imagepng($gray); 
    imagedestroy($gray); 
+0

"3. Daire/elipste istediğiniz alanın maske png görüntüsünü oluşturun (üzerinde beyaz bir şekil olan siyah bir görüntü, siyahta alfa saydamlığının rengine ayarlayın) - $ mask 4. $ maskeyi kopyalayın Alfa saydamlığını koruyan $ firstcopy'in tepesi. " Artık orijinal görüntüde siyah beyaz bir daire mi var? Ya da siyah beyaz bir daire ile şeffaf bir görüntü mü? Ayrıca, seçimin kendisinde siyah veya beyaz varsa, her şeyi tekrar birleştirirken son aşamada yanlış olmaz mı? – MSpreij

+0

@MSpreij Yapmanız gereken şeylerle ilgili bir kod örneği ekledim ... Bunu test ettim ve çalıştığını biliyorum – jsnfwlr

+0

Teşekkürler! Daha sonra bu akşam deneyeceğim. – MSpreij

İlgili konular