Skip to main content

Simple image box arithmetic

Project description

This provides image crop/resize monanoid for chaining multiple resize, crop actions and producing a resulting crop/resize action pair.

This is possible given the following insights:

-- resize absorption law; the left resize is canceled out by the
-- right resize
Box box `resize` width -> height -> Box box
((box `resize` width height) `resize` w2, h2) = box resize (w2, h2)

-- crop composition; the right crop box is an offset of the left crop box
Box box `crop` left -> top -> right -> bottom -> Box box
((box `crop` left top right bottom) `crop` l t r b) = box `crop` left+l top+t left+r top+b

With these two insights, we can compose two resize and two crop actions. The next step is composing a resize and crop action.

This is possible using a ResizeCrop Monoid whose dot function keeps track of the resize width, height and crop box and scales these values appropriately.

Usage

The usage is fairly simple:

from boxmath import box, resize, crop, size, make_transformer
from wand import image

# Load the image to get its width and height
i = image.Image(filename="chrysanthemum.jpg")
b = box(i.width, i.height)

# manipulate the virtual image
b = resize(b, 629, 483)
b = crop(b, 0, 0, 480, 480)
b = resize(b, 1000, 1000)

# render
def resizer(img, w, h):
    img.resize(int(w), int(h), filter=FILTER)
    return img

def cropper(img, l,t,r,b):
    img.crop(int(l),int(t),int(r),int(b))
    return img

t = make_transformer(b, resizer, cropper)
i = t(i)
i.save(filename="chrysanthemum-1000x1000.jpg")

Normally, if we would of used wand or PIL directly, each resize would degrade the image. The action of down scaling and then up scaling would wreck the quality of the image; with the power of math, we only apply the resize and crop when we need render the image.

Not that the width, height, left, top, right, and bottom values passed to the resizer and cropper functions are cast as ints.

This is because they are either fractions.Fraction() instances or int(). boxmath uses the Fraction class to ensure precision while resizing and cropping.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

boxmath-0.1.0.tar.gz (9.6 kB view details)

Uploaded Source

File details

Details for the file boxmath-0.1.0.tar.gz.

File metadata

  • Download URL: boxmath-0.1.0.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for boxmath-0.1.0.tar.gz
Algorithm Hash digest
SHA256 560a56eab507b6907aced6d9689331688915d675babc45dedd4ee9948f1a5db4
MD5 007c3b2e019cd879209c8dd14849ffa6
BLAKE2b-256 f23ee4137fd00fd803e16bf0c01f44d80eabf0613dd8d37417dfe8375fe4bb90

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page