Imagick with MAMP + php 5.3.6 + cakephp - php

I'm having an issue with imagick running on a MAMP installation within a cakephp app.
I have followed the install instructions as indicated here and the install seems to have worked in the sense that the class 'Imagick' exists for me if i test it in a php script (I can see the module is loaded in phpinfo). However any examples that I run utilising the class hang as soon as I echo any content. My view is:
<?php
/* Create a new imagick object */
$im = new Imagick();
/* Create new image. This will be used as fill pattern */
$im->newPseudoImage(50, 50, "gradient:red-black");
/* Create imagickdraw object */
$draw = new ImagickDraw();
/* Start a new pattern called "gradient" */
$draw->pushPattern('gradient', 0, 0, 50, 50);
/* Composite the gradient on the pattern */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);
/* Close the pattern */
$draw->popPattern();
/* Use the pattern called "gradient" as the fill */
$draw->setFillPatternURL('#gradient');
/* Set font size to 52 */
$draw->setFontSize(52);
/* Annotate some text */
$draw->annotation(20, 50, "Hello World!");
/* Create a new canvas object and a white image */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");
/* Draw the ImagickDraw on to the canvas */
$canvas->drawImage($draw);
/* 1px black border around the image */
$canvas->borderImage('black', 1, 1);
/* Set the format to PNG */
$canvas->setImageFormat('png');
/* Output the image */
header("Content-Type: image/png");
echo $canvas;
?>
This script will just hang as soon as the echo $canvas is encountered. The script works perfectly in a plain old php file i.e outside of cake but it hangs when visited via my cakephp app action. My action code is:
public function test(){
$this->layout = false;
}
Cake error log is empty.

Okay the issue was with how the header was set in cakephp. Cake didn't allow me to set the page header in the view that way.
I added the following code to the test action:
$this->response->type("image/png");
And it works perfectly now.

Related

PHP Imagick setFont not working in web but works in console

Here's the Code:
/* Create Imagick objects */
$image = new \Imagick();
$draw = new \ImagickDraw();
$color = new \ImagickPixel('#000000');
$background = new \ImagickPixel('none'); // Transparent
/* Font properties */
$draw->setFont("annabelle");
$draw->setFontSize(80);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
/* Get font metrics */
$metrics = $image->queryFontMetrics($draw, $text);
/* Create text */
$draw->annotation(0, $metrics['ascender'], $text);
/* Create image */
$image->newImage($metrics['textWidth'], $metrics['textHeight'], background);
$image->setImageFormat('png');
$image->drawImage($draw);
/* Save image */
file_put_contents('imagick_test.png', $image);
?>
And ImageMagick configuration file:
<?xml version="1.0" encoding="UTF-8"?>
<typemap>
<include file="type-dejavu.xml" />
<include file="type-ghostscript.xml" />
<include file="type-windows.xml" />
<type name="annabelle" family="annabelle" glyphs="/home/nginx/testing/annabelle.ttf" />
</typemap>
If I call this in console mode by: php -f test.php, it's OK. But when I accessing by web interface: http://test-srv/testing/test.php, It raise an exception:
Fatal error: Uncaught exception 'ImagickException' with message 'The path does not exist: /home/nginx/testing/annabelle' in /home/nginx/testing/test.php:15 Stack trace: #0 /home/nginx/testing/test.php(15): ImagickDraw->setfont('annabelle') #1 {main} thrown in /home/nginx/testing/test.php on line 15
I tried use setFontFamily() instead of setFont() like this:
...
/* Font properties */
$draw->setFontFamily("annabelle");
$draw->setFontSize(80);
...
Or using the font file instead using font name in setFont() like this:
...
/* Font properties */
$draw->setFont("annabelle.ttf");
$draw->setFontSize(80);
...
The image created like this:
The right one should like this if I run the code in cosole:
Well, I get the answer.
I've upgraded php from 5.5 to 5.6, than I found Imagick module disabled so I re-emerge Imagick with PHP_TARGET="php5-6" (I'm running gentoo). But I forget restart php-fpm service. After I restart the service, it runs right.

How to use PHP drawing functions with Laravel

I'm trying to use PHP shape drawing functions with the Laravel framework but I am having some trouble.
So, I just to test it out, basically just copied the example from php.net and used it in a closure and a test route.
Route::get('maptest', function()
{
$image = imagecreatetruecolor(200, 200);
$red = imagecolorallocate($image, 227, 32, 32);
imagefilledrectangle($image, 100, 80, 50, 25, $red);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
});
doing it this way works fine.
the problem is when I throw a Controller and a View into the mix. When I set the headers and what not and create a Response, I get a little broken picture icon in the top left corner of the window and nothing on the page loads at all.
this is how I am setting the headers.
(I know this is posted everywhere, but none of the solutions I could find seemed to work for me.)
public function show($id)
{
$user = User::find($id);
$view = View::make('profile/home', ['user' => $user]);
$response = Response::make($view, 200);
$response->header('Content-type', 'image/png');
return $response;
}
So the result of the above code (inside my controller) gives me a little broken picture icon in top left corner of window.

How to move the generated graph into desired folder in php?

I have generated the bar graph using php.I have downloaded class library from this link. http://www.pchart.net/download.I am getting the graph.
what i want to do is after creating the image,it should not output to the browser.Instead of that I want to save the images in particular folder. what should i do for that? Thanks in advance.This is my code
include("pChart/class/pData.class.php");
include("pChart/class/pDraw.class.php");
include("pChart/class/pPie.class.php");
include("pChart/class/pImage.class.php");
$MyData = new pData();
$MyData->addPoints($val,"ScoreA");
$MyData->setSerieDescription("ScoreA","Application A");
/* Define the absissa serie */
$MyData->addPoints($keys,"Labels");
$MyData->setAbscissa("Labels");
/* Create the pChart object */
$myPicture = new pImage(300,260,$MyData);
/* Draw a solid background */
$Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
$myPicture->drawFilledRectangle(0,0,300,300,$Settings);
/* Overlay with a gradient */
$Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
$myPicture->drawGradientArea(0,0,300,260,DIRECTION_VERTICAL,$Settings);
$myPicture->drawGradientArea(0,0,300,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>100));
/* Add a border to the picture */
$myPicture->drawRectangle(0,0,299,259,array("R"=>0,"G"=>0,"B"=>0));
/* Write the picture title */
$myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
$myPicture->drawText(10,13,"pPie - Draw 2D pie charts",array("R"=>255,"G"=>255,"B"=>255));
/* Set the default font properties */
$myPicture->setFontProperties(array("FontName"=>"pChart/fonts/Forgotte.ttf","FontSize"=>10,"R"=>80,"G"=>80,"B"=>80));
/* Create the pPie object */
$PieChart = new pPie($myPicture,$MyData);
/* Draw an AA pie chart */
$PieChart->draw3DPie(160,140,array("Radius"=>70,"DrawLabels"=>TRUE,"LabelStacked"=>TRUE,"Border"=>TRUE));
/* Write the legend box */
$myPicture->setShadow(FALSE);
$PieChart->drawPieLegend(15,40,array("Alpha"=>20));
$myPicture->autoOutput("image");
Try to use:
$myPicture->render("image_name.png");
It worked for me in 1.x, don't know about 2.x - did not used it.
render() is documented in the pChart wiki on below link:
http://wiki.pchart.net/doc.faq.script.output.html

Why the pchart chart does not render? I have gd2 installed

I am trying to integrate a chart into a website. I tested the gd2 installment by trying to see the examples, which works, see here. Then I went ahead and integrate it in my php file, using this code:
include("grafice/class/pData.class.php");
include("grafice/class/pDraw.class.php");
include("grafice/class/pImage.class.php");
//creaza si populeaza obiectul
$MyData = new pData();
$MyData->addPoints(array(4,VOID,VOID,10,8,3),"Proba 1");
$MyData->addPoints(array(3,10,5,8,5,5),"Proba 2");
$MyData->addPoints(array(2,7,5,1,9,2),"Proba 3");
$MyData->setSerieTicks("Proba 2",4);
$MyData->setSerieWeight("Proba 3",2);
$MyData->setAxisName(0,"Note");
$MyData->addPoints(array("Ian","Feb","Mar","Apr","Mai","Iun"),"Labels");
$MyData->setSerieDescription("Labels","Luni");
$MyData->setAbscissa("Labels");
// creaza obiectul chart
$myPicture = new pImage(700,230,$MyData);
//deseneaza fundalul
$Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
$myPicture->drawFilledRectangle(0,0,700,230,$Settings);
// suprapune un gradient
$Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50);
$myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
$myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
// bordura
$myPicture->drawRectangle(0,0,699,229,array("R"=>0,"G"=>0,"B"=>0));
// titlul pozei
$myPicture->setFontProperties(array("FontName"=>"fonts/Silkscreen.ttf","FontSize"=>6));
$myPicture->drawText(10,13,"EXEMPLU",array("R"=>255,"G"=>255,"B"=>255));
// titlul graficului
$myPicture->setFontProperties(array("FontName"=>"fonts/Forgotte.ttf","FontSize"=>11));
$myPicture->drawText(250,55,"Media Notelor",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
//deseneaza marimea 1
$myPicture->setGraphArea(60,60,450,190);
$myPicture->drawFilledRectangle(60,60,450,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
$AxisBoundaries = array(0=>array("Min"=>0,"Max"=>10));
$scaleSettings = array("GridR"=>200,"GridG"=>200,"GridB"=>200,"DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE,"Mode"=>SCALE_MODE_MANUAL, "ManualScale"=>$AxisBoundaries);
$myPicture->drawScale($scaleSettings);
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
$myPicture->setFontProperties(array("FontName"=>"fonts/pf_arma_five.ttf","FontSize"=>6));
$myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayColor"=>DISPLAY_AUTO));
$myPicture->setShadow(FALSE);
//deseneaza marimea 2
$myPicture->setGraphArea(500,60,670,190);
$myPicture->drawFilledRectangle(500,60,670,190,array("R"=>255,"G"=>255,"B"=>255,"Surrounding"=>-200,"Alpha"=>10));
$myPicture->drawScale(array("Pos"=>SCALE_POS_TOPBOTTOM,"DrawSubTicks"=>TRUE));
$myPicture->setShadow(TRUE,array("X"=>-1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
$myPicture->drawLineChart();
$myPicture->setShadow(FALSE);
// deseneaza legenda
$myPicture->drawLegend(510,205,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
//rendereaza poza
$myPicture->autoOutput("img/example.drawLineChart.png");
Unfortunately, this renders the whole page like so: (I am uploading a picture since you need an account to see it)
Did I did something wrong? I used this code in a function.
ALSO, in WAMP examples not work. Any way around that?
I managed to do it, and posting here to help others!
so, I made the function, but I edited the BOLD part
function grafice()
{
/* pChart library inclusions */
include("../class/pData.class.php");
include("../class/pDraw.class.php");
include("../class/pImage.class.php");
/* Create and populate the pData object */
$MyData = new pData();
$MyData->addPoints(array(10,5,7,8), "Probe 1");
$MyData->setSerieWeight("Probe 1",2);
$MyData->setAxisName(0,"Media Generala");
$MyData->addPoints(array("Ian","Feb","Mar","Apr","Mai","Iun"),"Labels");
$MyData->setSerieDescription("Labels","Luni");
$MyData->setAbscissa("Labels");
$serieSettings = array("R"=>255,"G"=>185,"B"=>11);
$MyData->setPalette("Probe 1",$serieSettings);
/* Create the pChart object */
$myPicture = new pImage(500,230,$MyData);
/* Draw the background */
$Settings = array("R"=>248, "G"=>226, "B"=>174, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107);
$myPicture->drawFilledRectangle(0,0,700,230,$Settings);
/* Overlay with a gradient */
$Settings = array("StartR"=>238, "StartG"=>216, "StartB"=>174, "EndR"=>238, "EndG"=>216, "EndB"=>174, "Alpha"=>50);
$myPicture->drawGradientArea(0,0,700,230,DIRECTION_VERTICAL,$Settings);
$myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80));
/* Add a border to the picture */
$myPicture->drawRectangle(0,0,499,229,array("R"=>0,"G"=>0,"B"=>0));
/* Write the picture title */
$myPicture->setFontProperties(array("FontName"=>"../fonts/Silkscreen.ttf","FontSize"=>6));
$myPicture->drawText(10,13,"Evolutia Mediei Generale",array("R"=>255,"G"=>255,"B"=>255));
/* Write the chart title */
$myPicture->setFontProperties(array("FontName"=>"../fonts/Forgotte.ttf","FontSize"=>11));
$myPicture->drawText(250,55,"Media Generala",array("FontSize"=>20,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
/* Draw the scale and the 1st chart */
$AxisBoundaries = array(0=>array("Min"=>0,"Max"=>10));
$scaleSettings = array("DrawSubTicks"=>TRUE,"Mode"=>SCALE_MODE_MANUAL, "ManualScale"=>$AxisBoundaries);
$myPicture->setGraphArea(60,60,450,190);
$myPicture->drawFilledRectangle(60,60,450,190,array("R"=>0,"G"=>0,"B"=>0,"Surrounding"=>-200,"Alpha"=>10));
$myPicture->drawScale($scaleSettings);
$myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10));
$myPicture->setFontProperties(array("FontName"=>"../fonts/pf_arma_five.ttf","FontSize"=>10,"R"=>0,"G"=>0,"B"=>0));
$myPicture->drawLineChart(array("DisplayValues"=>TRUE,"DisplayR"=>0, "DisplayG"=>0, "DisplayB"=>0, "DisplayOffset"=>10));
$myPicture->setShadow(FALSE);
/* Render the picture (choose the best way) */
/* $myPicture->**( I DELETED ThIS)--> autoOutput <---** ("pictures/example.drawLineChart.png"); and added */
$myPicture->render("pictures/example.drawLineChart.png");
}
Then, when I want to call it, like so :
<?php grafice(); ?>
And then I can do:
<img src="pictures/example.drawLineChart.png" />
Now I just change the picture name with the session id, and so I will have a different graph for everyone ;) Hopefully this will help someone!

ImageMagick equivalent to Box-shadow CSS property

I want to imitate the box-shadow CSS property in ImageMagick for an image. I want it to behave exactly the same. Is there any function or equivalent mapping?
<?php
/* Read the image into the object */
$im = new Imagick( 'a.jpg' );
$im->setImageFormat("png");
/* Make the image a little smaller, maintain aspect ratio */
$im->thumbnailImage( 200, null );
/* Clone the current object */
$shadow = $im->clone();
/* Set image background color to black (this is the color of the shadow) */
$shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );
/* Create the shadow */
$shadow->shadowImage( 80, 3, 5, 5 );
/* Imagick::shadowImage only creates the shadow. That is why the original image is composited over it */
$shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );
/* Display the image */
header( "Content-Type: image/jpeg" );
echo $shadow;
?>
also you can see imagemagick for bash script
I think what you're looking for is Imagick::shadowImage (-shadow switch for CLI)

Categories