public function getEstimatedDimensions($asset)
{
$originalWidth = $asset->getWidth();
$originalHeight = $asset->getHeight();
$dimensions = [];
$transformations = $this->getItems();
if (is_array($transformations) && count($transformations) > 0) {
if ($originalWidth && $originalHeight) {
// this is the more accurate method than the other below
$dimensions["width"] = $originalWidth;
$dimensions["height"] = $originalHeight;
foreach ($transformations as $transformation) {
if (!empty($transformation)) {
$arg = $transformation["arguments"];
if (in_array($transformation["method"], ["resize", "cover", "frame", "crop"])) {
$dimensions["width"] = $arg["width"];
$dimensions["height"] = $arg["height"];
} elseif ($transformation["method"] == "scaleByWidth") {
if ($arg["width"] <= $dimensions["width"] || $asset->isVectorGraphic()) {
$dimensions["height"] = round($arg["width"] / $dimensions["width"] * $dimensions["height"], 0);
$dimensions["width"] = $arg["width"];
}
} elseif ($transformation["method"] == "scaleByHeight") {
if ($arg["height"] < $dimensions["height"] || $asset->isVectorGraphic()) {
$dimensions["width"] = round($arg["height"] / $dimensions["height"] * $dimensions["width"], 0);
$dimensions["height"] = $arg["height"];
}
} elseif ($transformation["method"] == "contain") {
$x = $dimensions["width"] / $arg["width"];
$y = $dimensions["height"] / $arg["height"];
if ($x <= 1 && $y <= 1 && !$asset->isVectorGraphic()) {
continue;
}
if ($x > $y) {
$dimensions["height"] = round($arg["width"] / $dimensions["width"] * $dimensions["height"], 0);
$dimensions["width"] = $arg["width"];
} else {
$dimensions["width"] = round($arg["height"] / $dimensions["height"] * $dimensions["width"], 0);
$dimensions["height"] = $arg["height"];
}
} elseif ($transformation["method"] == "cropPercent") {
$dimensions["width"] = ceil($dimensions["width"] * ($arg["width"] / 100));
$dimensions["height"] = ceil($dimensions["height"] * ($arg["height"] / 100));
} elseif (in_array($transformation["method"], ["rotate", "trim"])) {
// unable to calculate dimensions -> return empty
return [];
}
}
}
} else {
// this method is only if we don't have the source dimensions
// this doesn't necessarily return both with & height
// and is only a very rough estimate, you should avoid falling back to this functionality
foreach ($transformations as $transformation) {
if (!empty($transformation)) {
if (is_array($transformation["arguments"]) && in_array($transformation["method"], ["resize", "scaleByWidth", "scaleByHeight", "cover", "frame"])) {
foreach ($transformation["arguments"] as $key => $value) {
if ($key == "width" || $key == "height") {
$dimensions[$key] = $value;
}
}
}
}
}
}
}
// ensure we return int's, sometimes $arg[...] contain strings
$dimensions["width"] = (int) $dimensions["width"];
$dimensions["height"] = (int) $dimensions["height"];
return $dimensions;
}