Search by

trisnawan / image-resizer

trisnawan

Resizer, Thumbnailer, Cropper Image with PHP Imagick

Package info

github.com/trisnawan/image-resizer

pkg:composer/trisnawan/image-resizer

Statistics

Installs: 98

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

v2.0.1 2026-10-12 15:56 UTC

This package is auto-updated.

Last update: 2026-10-12 15:57:37 UTC


README

Resize, crop, convert, and watermark images using either Imagick or GD with the same API.

Instalation

composer require trisnawan/image-resizer

Initialization

use Trisnawan\ImageResizer\ImageResizer;
// Image from user upload
$filePath = $_FILES["image"]["tmp_name"];

// Image from local storage
$filePath = "path/to/image_file.jpg";

// Image from a remote URL (http / https)
$filePath = "https://example.com/image_file.jpg";

// Default library: Imagick
$resizer = new ImageResizer($filePath);

// Explicit Imagick
$resizer = new ImageResizer($filePath, 'imagick');

// Use GD
$resizer = new ImageResizer($filePath, 'gd');

// Optional PDF render resolution in DPI
$resizer = new ImageResizer($filePath, 'imagick', 300);

Image Source from URL

Pass an http:// or https:// URL instead of a file path and the file is downloaded automatically by both GD and Imagick.

// GD
$resizer = new ImageResizer('https://example.com/image_file.jpg', 'gd');
$resizer->maxWidth(640);
$resizer->writeImage('thumbnails/image_file.jpg');

// Imagick
$resizer = new ImageResizer('https://example.com/image_file.jpg', 'imagick');
$blob = $resizer->getBlob();

Notes:

  • Downloads use cURL when the extension is available, and fall back to PHP streams (allow_url_fopen).
  • The default timeout is 10 seconds. Redirects are followed up to 5 hops, and redirects to non-HTTP(S) schemes are rejected.
  • The image format is detected from the downloaded content, so URLs without a file extension also work.
  • Non-2xx HTTP responses throw a RuntimeException.
  • Keep in mind that any caller-controlled URL can target internal hosts (SSRF). Validate or allow-list user supplied URLs in your own application.

PDF Source

// Automatically load the first page of a PDF
$resizer = new ImageResizer('../folder/file.pdf');

// Load page 2 from a PDF
$resizer = new ImageResizer('../folder/file.pdf[2]');

// Render a PDF page with higher resolution for sharper output
$resizer = new ImageResizer('../folder/file.pdf[2]', 'imagick', 300);

// If GD is selected for a PDF, the library automatically falls back to Imagick
$resizer = new ImageResizer('../folder/file.pdf', 'gd', 300);

// PDF over HTTP is supported by Imagick (GD falls back to Imagick)
$resizer = new ImageResizer('https://example.com/file.pdf');
$resizer = new ImageResizer('https://example.com/file.pdf[2]', 'imagick', 300);

$pdfResolution is optional and only affects PDF sources. The default value is 150 DPI. PDF page numbers in the path use one-based numbering, so [1] is the first page and [2] is the second page. Remote PDF files are downloaded to a temporary file, rendered, and the temporary file is removed afterwards.

Resize Image

Use the maximum pixels and the image will be automatically reduced to the maximum size.

// Max Width in pixels
$maxWidth = 640;
$resizer->maxWidth($maxWidth);

Crop Image

// Crop the image into a square from the center
$resizer->cropCenter();

// Crop the image into a square from the top
$resizer->cropTop();

Add Text Watermark

// Basic watermark with automatic bottom-right placement
$resizer->createWatermark('© My Brand');

// Manual position
$resizer->createWatermark('© My Brand', 20, 40);

// Manual position with custom size, opacity, and color
$resizer->createWatermark('© My Brand', 20, 40, 24, 0.45, '#ffffff');

// Opacity also accepts percent values
$resizer->createWatermark('© My Brand', null, null, 18, 55, '#f5f5f5');

Parameter summary:

  • $text: watermark text.
  • $x: horizontal position. If omitted, the watermark is placed automatically at the bottom-right.
  • $y: vertical position. If omitted, the watermark is placed automatically at the bottom-right.
  • $size: optional text size.
  • $opacity: optional opacity, accepts 0..1 or 1..100.
  • $color: optional hex color such as #ffffff or #fff.

GD uses TrueType text automatically when a common system font is available, and falls back to the built-in GD bitmap font otherwise.

Save to Local Storage

// Keep the original format if the extension is the same
$saveFilePath = "path/to/image_new.jpg";
$resizer->writeImage($saveFilePath);

// Convert output format based on the target extension
$resizer->writeImage('path/to/image_new.webp');
$resizer->writeImage('path/to/image_new.png');

If the output filename has no extension, the original image format is used.

Show Blob Image

// Show in blob
$blob = $resizer->getBlob();

Full Example

use Trisnawan\ImageResizer\ImageResizer;

$filePath = $_FILES["image"]["tmp_name"];

$resizer = new ImageResizer($filePath, 'gd');
$resizer->maxWidth(1280);
$resizer->cropCenter();
$resizer->createWatermark('© My Brand', null, null, 20, 0.5, '#ffffff');
$resizer->writeImage('uploads/profile.webp');