Skip to main content

convert one image to several sizes in django REST and django models

Project description

onetomultipleimage

onetomultipleimage is a django package to convert one image to several sizes. You give an image (with sizes), and receive uploaded images with that sizes. It can be used in REST or django model.

installation

1- run: pip install onetomultipleimage[jalali]

To install onetomultipleimage with Jalali date support, add [jalali] part.
also put IMAGES_PATH_TYPE='jalali' in settings.py, now jalali date path used (instead default gregorian) like:
/media/FatherImage/1401/12/13/small.jpg instead of: /media/FatherImage/2023/3/4/small.jpg

2- to install onetomultipleimage models, add 'onetomultipleimage' to INSTALLED_APPS of project's settings.py after makemigrations and migrate, models will be created.

 

Serializer Field: OneToMultipleImage

Receives image in Base64/form-data with list of sizes and generate images with specified sizes.

OneToMultipleImage fields:

  • image: Base64ImageField, accept data in base64 or form-data in writing and retursn uploaded image object. in representing, shows image url.

  • alt: CharField, stores alt of the image. if not alt value is provided, the program fill it with a 6 digit uuid followed by the image size.

  • size: CharField, stores size of the image as string. optional.

OneToMultipleImage arguments:

  • sizes: list of sizes in str. for generate original image use 'default'. required in writing.

  • upload_to: path in str for uploads image. required in writing.

  • data: it is same data pass to serializer in writing, but structure should be:
    {'image': formdata_file/Base64_str, 'alt': 'some_alt'}

    • image key is required. can be formdata file or Base64 str.
    • alt is optional and will fill auto if left blank.

Example 1:

from onetomultipleimage.fields import OneToMultipleImage
image = request.FILES['image']
serializer = OneToMultipleImage(data={'image': image}, sizes=['120', '240', 'default'], upload_to='posts/')
serializer.is_valid()
serializer.validated_data

.validated_data here uploaded 3 image with 120px height, 240px height, and default (original) image sizes.
validated_data returns deserialized of 'image', 'alt', 'size' fields:

[{'image': <Upload object 3d5cb1-120 - (.image .url .alt .size)>, 'alt': '3d5cb1-120', 'size': 120}, {'image': <Upload object 3d5cb1-240 - (.image .url .alt .size)>, 'alt': '3d5cb1-240', 'size': 240}, {'image': <Upload object 3d5cb1-default - (.image .url .alt .size)>, 'alt': '3d5cb1-default', 'size': 'default'}]```

&nbsp;  
**OneToMultipleImage** can use inside a serializer.   
**Example 2**:  
```python
class PostSerializer(serializers.Serializer):
    image = OneToMultipleImage(sizes=['120', '240', 'default'], upload_to='posts/')

data = {'image': {'image': "data:image/jpeg;base64,/9j/..."}}  # image in Base64 (str)
serializer = PostSerializer(data=data)
serializer.is_valid()
serializer.validated_data

 

OneToMultipleImage in reading:

Example 1:

from onetomultipleimage.field import OneToMultipleImage
serializer = OneToMultipleImage(data={'image': image}, sizes=['120', '240', 'default'], upload_to='posts/')
serializer.is_valid()
serialized = OneToMultipleImage(serializer.validated_data).data
return Response(serialized)

serialized version looks like:

[{'image': '/media/posts/1403/4/25/cd4851b839d0-120.JPEG', 'alt': '584fe1-120', 'size': 120}, 
 {'image': '/media/posts/1403/4/25/cd4851b839d0-240.JPEG', 'alt': '584fe1-240', 'size': 240}, 
 {'image': '/media/posts/1403/4/25/cd4851b839d0-default.JPEG', 'alt': '584fe1-default', 'size': 'default'}]

  Example 2:

from onetomultipleimage.field import OneToMultipleImage
class PostSerializer(serializers.Serializer):
    image = OneToMultipleImage(sizes=['120', '240', 'default'], upload_to='posts/')

data = {'image': {'image': "data:image/jpeg;base64,/9j/..."}}  # image in Base64 (str)
serializer = PostSerializer(data=data)
serializer.is_valid()
serialized = PostSerializer(serializer.validated_data).data
return Response(serialized)

serialized version looks like:

{'image': 
   [{'image': '/media/posts/1403/4/25/31557ad47c9d-120.JPEG', 'alt': 'e76815-120', 'size': 120}, 
    {'image': '/media/posts/1403/4/25/31557ad47c9d-240.JPEG', 'alt': 'e76815-240', 'size': 240}, 
    {'image': '/media/posts/1403/4/25/31557ad47c9d-default.JPEG', 'alt': 'e76815-default', 'size': 'default'}]
}

 

onetomultipleimage model

if you need django model for one-to-multy process, you have to add onetomultipleimage to INSTALLED_APPS. after migrate, you have two table FatherImage, ImageSizes.

FatherImage model

Store original image. attributes:

  • image: django ImageField. upload_to path is: 'FatherImage/year/month/day' but can override directly before model initializing.
  • alt: django CharField, represent image's alt, you can leave it blank to auto generating by uuid.uuid4
  • sizes: custom ListCharField, represent lists of sizes you want to create them. (like: ['120', '240'])

 

ImageSizes

Stores different sizes of original image. attributes:

  • image: django ImageField. upload_to path is: 'ImageSizes/year/month/day' but can override directly before model initializing.
  • alt: django CharField, represent image's alt, you can leave it blank to auto generating by uuid.uuid4
  • size: django CharField, represent size of image (in str).
  • father: django ForeignKey, reference to FatherImage. (FatherImage.imagesizes in reverse relation is accecible)

Example 1:

image = FatherImage(image=request.FILES['image'], sizes=['120', '240', '480'])
image.save()

now fatherimage and 3 imagesizes with 120, 240, 480 PXs is created. fatherimage.alt and imagesizes.alt auto generated like: 'db949e-default', ''db949z-120', ...

Example 2:

image = FatherImage(image=request.FILES['image'], alt='sea_food', sizes=['120', '240', '480'])
image.save()

after .save, fatherimage and 3 imagesizes with 120, 240, 480 PXs is created. fatherimage.alt is like: 'sea_food-default'

image = FatherImage.objects.get(alt='sea_food-default')
image_sizes = image.imagesizes.all()

image_sizes contain 3 different size of original image. image_sizes[0].alt is like: 'sea_food-120', image_sizes[1].alt: 'sea_food-240', ...

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

onetomultipleimage-1.2.0.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

onetomultipleimage-1.2.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file onetomultipleimage-1.2.0.tar.gz.

File metadata

  • Download URL: onetomultipleimage-1.2.0.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.8

File hashes

Hashes for onetomultipleimage-1.2.0.tar.gz
Algorithm Hash digest
SHA256 d37601bf18935b26a5f5ace13b5954df3dc5dfea93096084dc65d04e5319c285
MD5 1509a8f510699910208fd1575c136fcf
BLAKE2b-256 3d5a133fbdcf387df3566e4b78ad452a02da19cf0de05b0f4028ab00adeef5c7

See more details on using hashes here.

File details

Details for the file onetomultipleimage-1.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for onetomultipleimage-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40ce637bfa362dcff345e93c76789063280d16a326f09d3b39be84b751f1628a
MD5 fa6426d72f73ac55a927e40208b43bc4
BLAKE2b-256 ff35120a47c5f59f102c84fcece5316ff97f7d03c53db6feaec294324ebdf814

See more details on using hashes here.

Supported by

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