2010-12-09 13 views
5

के साथ फिशिए प्रभाव कैसे बनाएं PHP-GD के साथ एक छवि पर FishEye (या बैरल रूपांतरण) प्रभाव करने का कोई तरीका है? मुझे यह कुछ कोड के साथ मिला, लेकिन मुझे इसे PHP पर पोर्ट करने में कठिन समय है। जीडी साथPHP जीडी

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

+0

आप या तो सीधे ही algo फ़िशआई लागू करने के लिए है, जो SLOOOWWWW होने जा रहा है होगा। या ऐसा करने के लिए कुछ और तरीका खोजें। जैसे कि फ़ोटोशॉप में निष्पादन() या जैसा कि ... मुझे किसी भी व्यक्ति के बारे में पता नहीं है जिसने इसे किया है ... – DampeS8N

+0

यदि आपके पास सी प्रोग्रामिंग ज्ञान है, तो आप * gd * स्रोत कोड डाउनलोड कर सकते हैं और कार्यान्वित कर सकते हैं एक नई सुविधा - और इसे प्रकाशित करें! वह कोड इतना पुराना है ... वैसे भी, अगर आपको कोई समाधान मिल जाए, तो कृपया इसे पोस्ट करें! मैं जानना भी उत्सुक हूं ... बीटीडब्ल्यू आपका ओएस क्या है? –

+0

यह करने योग्य है, लेकिन यह MATLAB कोड से अधिक शामिल है। PHP बाइट अंकगणितीय के लिए उपयुक्त नहीं है और आपको शायद 3-परत सरणी (आर, जी, बी) की आवश्यकता होगी। तो मैं 'exec (imagemagick)' का सहारा लेने का सुझाव भी दूंगा। – mario

उत्तर

2

लेकिन ... - यह के साथ संभव है:

तो यहाँ

अपने कोड है जीडी और तेज़ !! ImageMagick
enter image description here (2 * स्रोतविड्थ)/पीआई के आकार के साथ एक नई छवि बनाएं।
नई छवि के प्रत्येक पिक्सेल को चलो और केंद्र से दूरी खोजें। स्रोत = hypot (एक्स centerX, y- centerY)
द्वारा गंतव्य स्रोत छवि में इसी दूरी का पता लगाएं। = 2 * आर * असिन (घ स्रोत/आर)/2
आर गंतव्य छवि के आधी चौड़ाई है। बेंच के निशान के साथ
उदाहरण देखें: 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

पीएचपी एक स्वीकार्य रास्ता में ऐसा नहीं कर सकते, संसाधित करते समय एक छवि पिक्सेल-दर-पिक्सेल वास्तव में धीमी गति से हो जाएगा ...

Imagick एक समारोह है कि सक्षम का समर्थन करता है आप अपनी अभिव्यक्ति लिखने के लिए (fximage), उसके बाद सबकुछ इमेगिक के भीतर आंतरिक रूप से संभाला जाएगा।

तो मुझे इमेगिक में आपके द्वारा अनुरोध किए गए कार्यों को करने का एक तरीका मिल गया है, मैंने "Scott builds Software" blog - fisheye effect in imagick से अभिव्यक्ति ली है। आप अपने ब्लॉग में अभिव्यक्ति की पूरी व्याख्या पढ़ सकते हैं। इस समारोह का और दस्तावेज आधिकारिक ImageMagick साइट पर उपलब्ध है, आप वहां सीख सकते हैं कि आप अपनी अभिव्यक्ति कैसे बना सकते हैं।

कृपया ध्यान दें कि वापसी मूल्य के बारे में PHP दस्तावेज़ गलत है, मैंने वहां टिप्पणी भी की है। समारोह वास्तविक इमेजिक वस्तु वापस कर देता है।

<?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

बहुत बहुत धन्यवाद! आप मेरे हीरो हैं! : डी – Daantje

संबंधित मुद्दे