2010-12-09 23 views
5

PHP-GD ile bir görüntü üzerinde FishEye (veya Barrel dönüşümü) efekti yapmanın bir yolu var mı? Bunu bir kodla buldum, ancak PHP'ye taşıyarak zor bir zamanım var. GD ilePHP GD ile balık gözü efekti nasıl oluşturulur

How can I implement a fisheye lens effect (barrel transformation) in MATLAB?

+0

Sen SLOOOWWWW olacak ki, doğrudan kendisi algo balık gözü uygulamak gerekecek ya. Ya da bunu yapmanın başka bir yolunu bul. Exec() veya benzeri ile photoshop içine macro'n gibi ... Bunu yapan herhangi birisini bilmiyorum ... – DampeS8N

+0

C programlama bilgisine sahipseniz, * gd * kaynak kodunu yükleyebilir ve uygulayabilirsiniz. yeni bir özellik - ve yayınla! Bu kod çok eski ... Neyse, bir çözüm bulursanız, lütfen gönderin! Ben de merak ediyorum ... Btw OS nedir? –

+0

Bu yapılabilir, ancak MATLAB kodundan daha fazla içerir. PHP, bayt aritmetiği için uygun değildir ve muhtemelen 3 katmanlı bir diziye (R, G, B) ihtiyacınız olacaktır. Bu yüzden ben de exec (imagemagick) 'e başvurmayı öneririm. – mario

cevap

2

Ama - O mümkündür : Yani burada

.kodunuz GD ve hızlı! ImageMagick ile karşılaştırmalı
enter image description here (2x SourceWidth)/PI boyutunda yeni bir görüntü yaratın.
Yeni görüntünün her bir pikseli boyunca yürüyün ve merkezden mesafeyi bulun. d kaynak = hypot (x-centerX, y-Centery)
d hedef ile kaynak görüntüde karşılık gelen mesafe bulun. = 2 * R * asin (d kaynak/r)/2
r hedef görüntünün yansı kadardır. tezgah işareti ile
bakınız örnekler: http://meindesign.net/picture2bubble/picture2bubble.php

function fisheye($infilename,$outfilename){ 
    $im=imagecreatefrompng($infilename); 
    $ux=imagesx($im);//Source imgage width(x) 
    $uy=imagesy($im);//Source imgage height(y) 
    $umx=$ux/2;//Source middle 
    $umy=$uy/2; 
    if($ux>$uy)$ow=2*$uy/pi();//Width for the destionation image 
    else $ow=2*$ux/pi(); 
    $out=imagecreatetruecolor($ow+1,$ow+1); 
    $trans=imagecolortransparent($out,ImageColorAllocate($out,0,0,0)); 
    imagefill($im,1,1,$trans); 
    for($c=0;$c<imagecolorstotal($im);$c++){//Copy palette 
     $col=imagecolorsforindex($im,$c); 
     imagecolorset($out,$c,$col[red],$col[green],$col[blue]); 
     } 
    $om=$ow/2;//destination middle 
    for($x=0;$x<=$ow;++$x){//Loop X in destination image 
     for($y=0;$y<=$ow;++$y){//Loop y in destination image 
      $otx=$x-$om;//X in relation to the middle 
      $oty=$y-$om;//Y in relation to the middle 
      $oh=hypot($otx,$oty);//distance 
      $arc=(2*$om*asin($oh/$om))/(2); 
      $factor=$arc/$oh; 
      if($oh<=$om){//if pixle inside radius 
      $color=imagecolorat($im,round($otx*$factor+$umx),round($oty*$factor+$umy)); 
      $r = ($color >> 16) & 0xFF; 
      $g = ($color >> 8) & 0xFF; 
      $b = $color & 0xFF; 
      $temp=imagecolorexact($out, $r, $g, $b); 
      imagesetpixel($out,$x,$y,$temp); 
      } 
      } 
     } 
    imagepng($out,$outfilename); 
    } 
6

PHP ... bir görüntü piksel-piksel gerçekten yavaş olacak işlenmesi, kabul edilebilir bir şekilde böyle bir şey yapamaz

IMagic etkinleştirmek bir özelliğini destekliyor Kendi ifadenizi yazmanız (fximage), bundan sonra her şey Imagick içinde dahili olarak ele alınacaktır.

Bu yüzden Imagick'te istediklerinizi yapmak için bir yol buldum, bu ifadeyi "Scott builds Software" blog - fisheye effect in imagick'dan aldım. İfadenin tüm açıklamasını kendi blogunda okuyabilirsiniz. Bu işlevin daha fazla belgelenmesi resmi ImageMagick sitesinde bulunabilir, kendi ifadelerinizi nasıl oluşturabileceğinizi öğrenebilirsiniz.

Geri dönüş değeriyle ilgili PHP belgelerinin yanlış olduğunu lütfen unutmayın. Fonksiyon, gerçek Imagick nesnesini döndürür. , Bununla ne yapmak dikkatli olun, bu yine de yavaş olduğunu akılda tutmak Neyse

<?php 
/* Create new object */ 
$im = new Imagick(); 
/* Create new checkerboard pattern */ 
$im->newPseudoImage(100, 100, "pattern:checkerboard"); 
/* Set the image format to png */ 
$im->setImageFormat('png'); 
/* Fill background area with transparent */ 
$trans = Imagick::VIRTUALPIXELMETHOD_TRANSPARENT; 
$im->setImageVirtualPixelMethod($trans); 
/* Activate matte */ 
$im->setImageMatte(true); 

/* This is the expression that define how to do the fisheye effect */ 
$distort_expression = 
'kk=w*0.5; 
ll=h*0.5; 
dx=(i-kk); 
dy=(j-ll); 
aa=atan2(dy,dx); 
rr=hypot(dy,dx); 
rs=rr*rr/hypot(kk,ll); 
px=kk+rs*cos(aa); 
py=ll+rs*sin(aa); 
p{px,py}'; 

/* Perform the distortion */ 
$im = $im->fxImage($distort_expression); 

/* Ouput the image */ 
header("Content-Type: image/png"); 
echo $im; 
?> 

...

+0

Çok teşekkür ederim! Kahramanımsın! : D – Daantje

İlgili konular