Elipsa - Izrez iz slike
6 naročnikov
6 naročnikov
Pozdravljeni!
Delam en app, kjer na client-sidu uporabnik nastavi kakšno elipso želi cropat iz slike. Prišel sem tako daleč, da imam sliko v canvas in elipso, ter kontrole kako naj ta elipsa izgleda. Problem sedaj pa je, da ne znam cropat elipse iz slike - samo kvadrat. Torej rabim elipso z prosojnostjo.
Primer kar imam do sedaj:
http://bit.ly/SiWxH0
Pozna kdo rešitev?
Lp
29 odgovorov
Živio!
Potreboval bi še eno pomoč, spet dela tale zadeva težave.
http://bit.ly/SiWxH0
Ko klikneš done, ti izreže kar si izbral.. Sedaj hočem temu selectionu narediti feather z ImageMagick. Problem je v tem, ker trenutno, ko premikaš elipso po sliki in klikneš done, naredim masko ki je velikosti fotografije in ima bel izrez tam kjer si postavil elipso:
Potem imam napisano funkcijo ki loči alpha channel iz slike in izreže:
function imagealphamask( &$picture, $mask ) {
// Get sizes and set up new picture
$xSize = imagesx( $picture );
$ySize = imagesy( $picture );
$newPicture = imagecreatetruecolor( $xSize, $ySize );
imagesavealpha( $newPicture, true );
imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) );
// Resize mask if necessary
if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {
$tempPic = imagecreatetruecolor( $xSize, $ySize );
imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );
imagedestroy( $mask );
$mask = $tempPic;
}
// Perform pixel-based alpha map application
for( $x = 0; $x < $xSize; $x++ ) {
for( $y = 0; $y < $ySize; $y++ ) {
$alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );
$alpha = 127 - floor( $alpha[ 'red' ] / 2 );
$color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );
}
}
// Copy back to original picture
imagedestroy( $picture );
$picture = $newPicture;
}
Torej, kako lahko maski z imagemagick povem da bi rad delal feather na robovih.
Recimo poskusil sem tole:
exec("convert img/maska.png -channel RGBA -blur 0x8 img/maska.png");
ampak to celotno masko naredi transparentno, ne samo elipse.
exec("convert img/maska.png -alpha set \ -background none -vignette 0x4 img/maska.png");
tole pa dela ok, ampak je problem da vzame celotno masko in črno ozadje fejda in ne bele elipse (zgornja slika)
Torej, če gledamo zgornjo sliko, moram fejdat robove bele elipse za izrez.
Če je rešitev težka se lahko dogovorimo tudi za plačilo.
lp
Drugače, kot uporaben link zgooglat, ti žal ne znam pomagat, ker nisem nikoli tega počel.
http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=18286
Za vse ki morda potrebujete.
Za feather bele maske na črni podlagi z imagemagick uporabite funkcijo:
exec("convert img/maska.png mask -blur 5x65000 -level 0x95% featheredmask img/maska.png");
Pa še eno moje zadnje vprašanje:
Pozna kdo funkcijo z katero lahko narišem elipso na sliko, in jo potem ROTIRAM v stopinjah? Imagefillellipse od php-ja mi nudi samo x,y in pa pozicijo, ne pa tudi koliko bi rad elipso obrnil. Anyone? ;)
A ni hitreje in lažje, če v google vpišeš :)
http://lmgtfy.com/?q=php+ellipse+rotate
http://www.php.net/manual/en/function.imageellipse.php#67420
Enjoy :)
@Blackmamba: :) Vem, sem že probal to, ampak ne nariše. Kako bi ti po tvoje prav klical to funkcijo da bi narisala ?
Recimo če imamo trenutno:
$mask = imagecreatetruecolor($width, $height);
$transparent = imagecolorallocate($mask, 255, 0, 0);
imagecolortransparent($mask, $transparent);
imagefilledellipse($mask, $x, $y, $w, $h, $transparent);
Ti bi namesto imagefilledellipse dal funkcijo za rotacijo ali kako? :)
Da. Sem se potrudil in ti naredil primer, čeprav imam še dosti svojega dela na lagerju.
http://lukna.com/elipsa.php
http://lukna.com/elipsa.php.txt
I fu*** love you :) Blackmamba, kontaktiraj prosim na ZS tvoj Skype.. te povabim na pivo ali frišno pico z pivom, pa da še kakšno rečeva ;)
Spet jaz. :)
Se prav lotujem tegale; Rad bi izrezal tole elipso zdaj iz slike, z kvadratim izrezom.. Poznam width in height elipse, in x in y na kateri je elipsa.
Lotil sem se tak:
$canvas = imagecreatetruecolor($wElipse, $hElipse);
$current_image = imagecreatefromjpeg($filename);
imagecopy($canvas, $current_image, 0, 0, $xElipse, $yElipse, $wElipse, $hElipse);
imagejpeg($canvas, $filename, 100);
Sicer cropa, ampak zelo slabo in popačeno... Anyone ima bolšo idejo ?
Sej vem, da si mene čakal :)
V spodnjem primeru sem shranil v transparentni png, kar je pomojem boljša ideja kot jpg.
http://lukna.com/elipsa2.php
http://lukna.com/elipsa2.php.txt