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((int) $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 true; } return false; } }