PHP / GD, nasıl başka bir görüntüden bir daireyi kopyalamak için?

2 Cevap php

Is there a reasonably straightforward way to copy a circular area from one image resource to another? Something like imagecopymerge except with circles or ovals etc?
If possible, I want to avoid having to use pre-created image files (any oval shape should be possible), and if there's transparency colours involved they should naturally leave the rest of the image alone.

Ben soruyorum nedeni, ilk geri orijinal üzerinde kopya kaplayan sonra, görüntünün bir kopyasını o bölgeyi silerek çalışan bir görüntü, bir "seçilmiş bir alanda" içeride görüntü işlemleri uygulamak için izin birkaç sınıfları var. Ama bir dikdörtgen seçmek ne isterseniz, ve o içinde bir daire kaldırın ve işlemleri sadece kalan alanı etkileyebilir var?

2 Cevap

Bu deneyebilirsiniz:

  1. Orijinal görüntü ile başlayın - $ img
  2. Png bu görüntüyü kopyalayın - $ kopyalamak
  3. $ Maske - daire / elips istediğiniz alanı (alfa şeffaflık rengi siyah seti ile üzerinde siyah bir şekle sahip bir 'magicpink' görüntü) bir maske png görüntü oluşturma
  4. Doları üstünden Kopyala $ maske Alfa şeffaflığı muhafaza kopya
  5. Eğer $ kopya gerekenleri değiştirin
  6. Kopyala $ Alfa şeffaflığı koruyarak $ img üzerinde geri kopyalayın

    // 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);  

"Sihirli Pembe" görüntüde ne olur ... O zaman işe yaramaz

Eğer these renk değiştirme komut dosyalarından birini çalıştırın ilk önce bu olay herhangi bir şans durur.