Intervention / image

PHP Image Processing
https://image.intervention.io
MIT License
13.88k stars 1.5k forks source link

Add bezier curve drawing tool #1363

Closed gammalogic closed 3 months ago

gammalogic commented 4 months ago

This commit adds a new bezier curve drawing tool as discussed in #1335.

The following code can be used to generate the sample image below:

require('./vendor/autoload.php');

use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
use Intervention\Image\Geometry\Factories\BezierFactory;

// create image manager with desired driver
$manager = new ImageManager(new Driver());

// read image from file system
// to display the sample set correctly the recommended image dimensions should be 350 x 500 pixels
$image = $manager->read('test.png');

// resize image proportionally to 500px height
$image->scale(height: 500);

// fill canvas background
$image = $image->fill('#444');

// draw a red cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 50); // control point 1
    $bezier->point(200, 50); // control point 2
    $bezier->point(150, 200); // control point 3
    $bezier->point(300, 200); // control point 4
    $bezier->border('#f00', 36); // border color & size
});

// draw an orange cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 50); // control point 1
    $bezier->point(200, 50); // control point 2
    $bezier->point(150, 200); // control point 3
    $bezier->point(300, 200); // control point 4
    $bezier->border('#ff7f00', 28); // border color & size
});

// draw a yellow cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 50); // control point 1
    $bezier->point(200, 50); // control point 2
    $bezier->point(150, 200); // control point 3
    $bezier->point(300, 200); // control point 4
    $bezier->border('#ff0', 20); // border color & size
});

// draw a green cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 50); // control point 1
    $bezier->point(200, 50); // control point 2
    $bezier->point(150, 200); // control point 3
    $bezier->point(300, 200); // control point 4
    $bezier->border('#0f0', 12); // border color & size
});

// draw a blue cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 50); // control point 1
    $bezier->point(200, 50); // control point 2
    $bezier->point(150, 200); // control point 3
    $bezier->point(300, 200); // control point 4
    $bezier->border('#00f', 4); // border color & size
});

// draw a yellow quadratic bezier curve with a filled red background
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(300, 260); // control point 1
    $bezier->point(150, 335); // control point 2
    $bezier->point(300, 410); // control point 3
    $bezier->background('f00'); // background color
    $bezier->border('ff0', 10); // border color & size
});

// draw a yellow cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 150); // control point 1
    $bezier->point(200, 350); // control point 2
    $bezier->point(200, 50); // control point 3
    $bezier->point(50, 250); // control point 4
    $bezier->border('#ff0', 10); // border color & size
});

// draw a yellow cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 250); // control point 1
    $bezier->point(200, 150); // control point 2
    $bezier->point(200, 450); // control point 3
    $bezier->point(50, 350); // control point 4
    $bezier->border('#ff0', 10); // border color & size
});

// draw a yellow cubic bezier curve
$image->drawBezier(function (BezierFactory $bezier) {
    $bezier->point(50, 350); // control point 1
    $bezier->point(200, 550); // control point 2
    $bezier->point(200, 250); // control point 3
    $bezier->point(50, 450); // control point 4
    $bezier->border('#ff0', 10); // border color & size
});

// save modified image in new format
$image->toPng()->save('foo.png');

header('Content-Type: image/png');
echo file_get_contents('foo.png');

II Bezier Curve Tool Sample Image

olivervogel commented 4 months ago

Wow, this is just flawless! I'm going to try the feature in detail, but I think it can be adopted as is and become part of version 3.7, which is scheduled for June 15th next week. Many thanks.

gammalogic commented 4 months ago

Thank you for your feedback and suggestions Oliver, I have made the changes.