Skip to content

Commit

Permalink
New methods for calculating scaled-image size
Browse files Browse the repository at this point in the history
  • Loading branch information
Marat-Tanalin committed Jun 2, 2020
1 parent da29f47 commit dd82f75
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 5 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
Calculates integer ratios for pixel-perfect image upscaling with optional aspect-ratio correction.
Calculates integer ratios and scaled-image size for pixel-perfect image upscaling with optional aspect-ratio correction.

See the project [webpage](http://tanalin.com/en/projects/integer-scaling/) for details.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "marat-tanalin/integer-scaling",
"version" : "1.2.3",
"version" : "1.3.0",
"type": "library",
"description": "Calculates integer ratios for pixel-perfect image upscaling with optional aspect-ratio correction.",
"homepage": "http://tanalin.com/en/projects/integer-scaling/",
Expand Down
90 changes: 87 additions & 3 deletions src/IntegerScaling.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

namespace MaratTanalin;

require_once 'IntegerScaling/Ratios.php';

class IntegerScaling
{
/**
Expand Down Expand Up @@ -46,7 +44,7 @@ public static function calculateRatio(int $areaWidth, int $areaHeight, int $imag
* @param int $imageHeight
* @param float $aspectX
* @param float $aspectY
* @return array(string => int)
* @return IntegerScaling\Ratios
*/
public static function calculateRatios(int $areaWidth, int $areaHeight, int $imageWidth, int $imageHeight, float $aspectX = 0.0, float $aspectY = 0.0) {
if ($imageWidth * $aspectY === $imageHeight * $aspectX) {
Expand Down Expand Up @@ -130,4 +128,90 @@ public static function calculateRatios(int $areaWidth, int $areaHeight, int $ima

return new IntegerScaling\Ratios($ratioX, $ratioY);
}

/**
* Calculates size (width and height) of scaled image
* without aspect-ratio correction (square pixels).
*
* @param int $areaWidth
* @param int $areaHeight
* @param int $imageWidth
* @param int $imageHeight
* @return IntegerScaling\Size
*/
public static function calculateSize(int $areaWidth, int $areaHeight, int $imageWidth, int $imageHeight) {
$ratio = self::calculateRatio($areaWidth, $areaHeight, $imageWidth, $imageHeight);

return new IntegerScaling\Size(
$imageWidth * $ratio,
$imageHeight * $ratio
);
}

/**
* Calculates size (width and height) of scaled image
* with aspect-ratio correction (rectangular pixels).
*
* @param int $areaWidth
* @param int $areaHeight
* @param int $imageWidth
* @param int $imageHeight
* @param float $aspectX
* @param float $aspectY
* @return IntegerScaling\Size
*/
public static function calculateSizeCorrected(int $areaWidth, int $areaHeight,
int $imageWidth, int $imageHeight, float $aspectX = 0.0, float $aspectY = 0.0)
{
$ratios = self::calculateRatios($areaWidth, $areaHeight, $imageWidth, $imageHeight, $aspectX, $aspectY);

return new IntegerScaling\Size(
$imageWidth * $ratios->x,
$imageHeight * $ratios->y
);
}

/**
* Calculates size (width and height) of scaled image with aspect-ratio
* correction with integer vertical scaling ratio, but fractional horizontal
* scaling ratio for the purpose of achieving precise aspect ratio while
* still having integer vertical scaling e.g. for uniform scanlines.
*
* @param int $areaWidth
* @param int $areaHeight
* @param int $imageWidth
* @param int $imageHeight
* @param float $aspectX
* @param float $aspectY
* @return IntegerScaling\Size
*/
public static function calculateSizeCorrectedPerfectY(int $areaWidth, int $areaHeight, int $imageHeight, float $aspectX, float $aspectY) {
$imageWidth = $imageHeight * $aspectX / $aspectY;

if ($areaHeight * $imageWidth < $areaWidth * $imageHeight) {
$areaSize = $areaHeight;
$imageSize = $imageHeight;
}
else {
$areaSize = $areaWidth;
$imageSize = $imageWidth;
}

$ratio = floor($areaSize / $imageSize);

if ($ratio < 1) {
$ratio = 1;
}

$width = round($imageWidth * $ratio);

if ($width > $areaWidth) {
$width--;
}

return new IntegerScaling\Size(
$width,
$imageHeight * $ratio
);
}
}
15 changes: 15 additions & 0 deletions src/IntegerScaling/Size.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

/*! IntegerScaling by Marat Tanalin | http://tanalin.com/en/projects/integer-scaling/ */

namespace MaratTanalin\IntegerScaling;

class Size
{
public $width, $height;

public function __construct(int $width, int $height) {
$this->width = $width;
$this->height = $height;
}
}

0 comments on commit dd82f75

Please sign in to comment.