2009-06-29 12 views
6

Czy istnieje dość prosty sposób na skopiowanie okrągłego obszaru z jednego zasobu obrazu na inny? Coś jak imagecopymerge z wyjątkiem okręgów lub owali itp.?
Jeśli to możliwe, chcę uniknąć konieczności używania gotowych plików graficznych (każdy owalny kształt powinien być możliwy), a jeśli są w nim zawarte kolory przezroczystości, powinny naturalnie pozostawić resztę obrazu w spokoju.PHP/GD, jak skopiować kółko z jednego obrazu do drugiego?

Powód Pytam, mam kilka klas, które pozwalają na zastosowanie operacji obrazowych wewnątrz "wybranego obszaru" obrazu, który działa najpierw poprzez usunięcie tego obszaru z kopii obrazu, a następnie nałożenie kopii z powrotem na oryginale. Ale co, jeśli chcesz wybrać prostokąt, a następnie w środku tego odznaczenia krąg, i czy operacje mają wpływ tylko na obszar, który pozostaje?

+0

Czy odpowiedź phalacee w rozwiązaniu problemu? Ta strona jest wskazywana przez [aktualne pytanie] (http://stackoverflow.com/questions/14900727/how-to-cut-a-part-of-the-image-and-paste-it-to-another -using-php), więc dobrze byłoby wiedzieć, czy zadziałało. – halfer

Odpowiedz

8

Można spróbować to:

  1. Uruchom z oryginalnego obrazu - $ img
  2. skopiować ten obraz do png - $ skopiować
  3. utworzyć maskę PNG obszaru, który ma w kręgu/elipsa (obraz "czarodziejski" z czarnym kształtem, z czarnym ustawionym na kolor przezroczystości alfa) - $ maska ​​
  4. Skopiuj maskę $ na górze kopii $ zachowując przezroczystość alfa
  5. Zmień to, co robisz trzeba na $ copy
  6. Kopiowanie $ skopiować z powrotem ponad $ img zachowaniu przejrzystości Alpha

    // 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. Utwórz obraz maski obszaru, który chcesz w okręgu/elipsie (czarny obraz z białym kształtem, z czarnym ustawionym na kolor przezroczystości alfa) - maska ​​$. górna część $ firstcopy zachowując przezroczystość Alpha. " Czy nie mam teraz oryginalnego obrazu z czarnym lub białym okręgiem? Czy też przezroczysty obraz z czarnym lub białym okręgiem? Ponadto, jeśli w selekcji jest czarny lub biały, czy to nie pójdzie źle na ostatnim etapie, gdy wszystko ponownie się połączy? – MSpreij

+0

@MSpreij Dodałem próbkę kodu ze szczegółami na temat tego, co musisz zrobić ... Przetestowałem to i wiem, że działa też – jsnfwlr

+0

Dzięki! Spróbuję tego później tego wieczoru. – MSpreij

Powiązane problemy