Source code for pierogis.ingredients.resize
from typing import Union
import numpy as np
from PIL import Image
from .ingredient import Ingredient
from .pierogi import Pierogi
[docs]class Resize(Ingredient):
"""
resize using width, height, and scale
"""
FILTERS = {
'default': Image.NEAREST,
'nearest': Image.NEAREST,
'box': Image.BOX,
'bicubic': Image.BICUBIC,
'bilinear': Image.BILINEAR,
'hamming': Image.HAMMING,
'lanczos': Image.LANCZOS,
}
[docs] def prep(
self,
width: int = None,
height: int = None,
scale: int = 1,
resample: Union[int, str] = FILTERS['default'],
**kwargs
):
"""
if only one of width and height is provided,
aspect ratio will be maintained.
when reducing size,
a dimension will round down if it would be a decimal
cook 5x5 pixels prepped with a .5 scale -> resized to 2x2
cook 2x3 pixels prepped with a width of 1 -> resized to 1x1
:param width: width to resize to
:param height: height to resize to
:param scale: scale multiplier (2 means 2x)
:param resample: resample filter to use
"""
if width is None and height is None and scale is None:
ValueError("One of width height or scale must be provided")
self.width = width
self.height = height
self.scale = scale
if resample in self.FILTERS:
resample = self.FILTERS[resample]
self.resample = resample
[docs] def cook(self, pixels: np.ndarray):
pierogi = Pierogi(pixels=pixels)
width = pixels.shape[0]
height = pixels.shape[1]
if self.width is not None and self.height is not None:
width = self.width
height = self.height
elif self.width is not None or self.height is not None:
aspect = width / height
if self.width is None:
width = self.height * aspect
height = self.height
elif self.height is None:
height = self.width / aspect
width = self.width
width *= self.scale
height *= self.scale
pierogi.resize(int(width), int(height), self.resample)
return pierogi.pixels