for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace Spatie\MediaLibrary\ResponsiveImages\WidthCalculator;
use Illuminate\Support\Collection;
use Spatie\MediaLibrary\Helpers\ImageFactory;
class FileSizeOptimizedWidthCalculator implements WidthCalculator
{
public function calculateWidthsFromFile(string $imagePath): Collection
$image = ImageFactory::load($imagePath);
$width = $image->getWidth();
$height = $image->getHeight();
$fileSize = filesize($imagePath);
return $this->calculateWidths($fileSize, $width, $height);
}
public function calculateWidths(int $fileSize, int $width, int $height): Collection
$targetWidths = collect();
$targetWidths->push($width);
$ratio = $height / $width;
$area = $height * $width;
$predictedFileSize = $fileSize;
$pixelPrice = $predictedFileSize / $area;
while (true) {
$predictedFileSize *= 0.7;
$newWidth = (int) floor(sqrt(($predictedFileSize / $pixelPrice) / $ratio));
if ($this->finishedCalculating($predictedFileSize, $newWidth)) {
return $targetWidths;
$targetWidths->push($newWidth);
protected function finishedCalculating(int $predictedFileSize, int $newWidth): bool
if ($newWidth < 20) {
return true;
if ($predictedFileSize < (1024 * 10)) {
return false;