Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - ConsumerAffairs/django-imagekit: Automated image processing for Django models. Currently v2.0.1. · GitHub
Skip to content

Repository files navigation

ImageKit is a Django app that helps you to add variations of uploaded images to your models. These variations are called "specs" and can include things like different sizes (e.g. thumbnails) and black and white versions.

For the complete documentation on the latest stable version of ImageKit, seeImageKit on RTD. Our changelog is also available.

Installation

  1. Install PIL or Pillow. If you're using an ImageField in Django, you should have already done this.
  2. pip install django-imagekit (or clone the source and put the imagekit module on your path)
  3. Add 'imagekit' to your INSTALLED_APPS list in your project's settings.py

Note

If you've never seen Pillow before, it considers itself a more-frequently updated "friendly" fork of PIL that's compatible with setuptools. As such, it shares the same namespace as PIL does and is a drop-in replacement.

Adding Specs to a Model

Much like django.db.models.ImageField, Specs are defined as properties of a model class:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
formatted_image=ImageSpecField(image_field='original_image', format='JPEG',
options={'quality': 90})

Accessing the spec through a model instance will create the image and return an ImageFile-like object (just like with a normal django.db.models.ImageField):

photo=Photo.objects.all()[0]
photo.original_image.url# > '/media/photos/birthday.tiff'photo.formatted_image.url# > '/media/cache/photos/birthday_formatted_image.jpeg'

Check out imagekit.models.ImageSpecField for more information.

If you only want to save the processed image (without maintaining the original), you can use a ProcessedImageField:

fromdjango.dbimportmodelsfromimagekit.models.fieldsimportProcessedImageFieldclassPhoto(models.Model):
processed_image=ProcessedImageField(format='JPEG', options={'quality': 90})

See the class documentation for details.

Processors

The real power of ImageKit comes from processors. Processors take an image, do something to it, and return the result. By providing a list of processors to your spec, you can expose different versions of the original image:

fromdjango.dbimportmodelsfromimagekit.modelsimportImageSpecFieldfromimagekit.processorsimportResizeToFill, AdjustclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
thumbnail=ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
ResizeToFill(50, 50)], image_field='original_image',
format='JPEG', options={'quality': 90})

The thumbnail property will now return a cropped image:

photo=Photo.objects.all()[0]
photo.thumbnail.url# > '/media/cache/photos/birthday_thumbnail.jpeg'photo.thumbnail.width# > 50photo.original_image.width# > 1000

The original image is not modified; thumbnail is a new file that is the result of running the imagekit.processors.ResizeToFill processor on the original. (If you only need to save the processed image, and not the original, pass processors to a ProcessedImageField instead of an ImageSpecField.)

The imagekit.processors module contains processors for many common image manipulations, like resizing, rotating, and color adjustments. However, if they aren't up to the task, you can create your own. All you have to do is implement a process() method:

classWatermark(object):
defprocess(self, image):
# Code for adding the watermark goes here.returnimageclassPhoto(models.Model):
original_image=models.ImageField(upload_to='photos')
watermarked_image=ImageSpecField([Watermark()], image_field='original_image',
format='JPEG', options={'quality': 90})

Admin

ImageKit also contains a class named imagekit.admin.AdminThumbnail for displaying specs (or even regular ImageFields) in the Django admin change list. AdminThumbnail is used as a property on Django admin classes:

fromdjango.contribimportadminfromimagekit.adminimportAdminThumbnailfrom .modelsimportPhotoclassPhotoAdmin(admin.ModelAdmin):
list_display= ('__str__', 'admin_thumbnail')
admin_thumbnail=AdminThumbnail(image_field='thumbnail')
admin.site.register(Photo, PhotoAdmin)

AdminThumbnail can even use a custom template. For more information, see imagekit.admin.AdminThumbnail.

Image Cache Backends

Whenever you access properties like url, width and height of an ImageSpecField, its cached image is validated; whenever you save a new image to the ImageField your spec uses as a source, the spec image is invalidated. The default way to validate a cache image is to check to see if the file exists and, if not, generate a new one; the default way to invalidate the cache is to delete the image. This is a very simple and straightforward way to handle cache validation, but it has its drawbacks—for example, checking to see if the image exists means frequently hitting the storage backend.

Because of this, ImageKit allows you to define custom image cache backends. To be a valid image cache backend, a class must implement three methods: validate, invalidate, and clear (which is called when the image is no longer needed in any form, i.e. the model is deleted). Each of these methods must accept a file object, but the internals are up to you. For example, you could store the state (valid, invalid) of the cache in a database to avoid filesystem access. You can then specify your image cache backend on a per-field basis:

classPhoto(models.Model):
...
thumbnail=ImageSpecField(..., image_cache_backend=MyImageCacheBackend())

Or in your settings.py file if you want to use it as the default:

IMAGEKIT_DEFAULT_IMAGE_CACHE_BACKEND='path.to.MyImageCacheBackend'

Community

Please use the GitHub issue tracker to report bugs with django-imagekit. A mailing list also exists to discuss the project and ask questions, as well as the official #imagekit channel on Freenode.

Contributing

We love contributions! And you don't have to be an expert with the library—or even Django—to contribute either: ImageKit's processors are standalone classes that are completely separate from the more intimidating internals of Django's ORM. If you've written a processor that you think might be useful to other people, open a pull request so we can take a look!

ImageKit's image cache backends are also fairly isolated from the ImageKit guts. If you've fine-tuned one to work perfectly for a popular file storage backend, let us take a look! Maybe other people could use it.

About

Automated image processing for Django models. Currently v2.0.1.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages