枕头调整像素化图像的大小-Django/枕头 [英] Pillow resize pixelating images - Django/Pillow
问题描述
我正在使用Django开发图像上传器.映像上传并保存到磁盘后,我正在尝试调整已保存图像的尺寸,同时保持其宽高比.我正在使用枕头进行图像处理/调整大小.当我尝试调整图像大小时会出现问题,即使调整大小后的图像的宽高比与原始图像的宽高比一样,它也会变得像素化.
I am developing an image uploader in Django. After the image has been uploaded and saved on disk, I'm trying to resize the saved image while maintaing its aspect ratio. I am using Pillow for image processing/resizing. The problem arises when I try to resize the image, it's getting pixelated even though the resized image's aspect ratio is same as that of the original image.
原始保存的图片: https://www.dropbox.com/s/80yk6tnwt3xnoun/babu_980604.jpeg
调整大小的像素化图像: https://www.dropbox.com/s/bznodpk4t4xlyqp/babu_736302.large.jpeg
Resized Pixelated Image: https://www.dropbox.com/s/bznodpk4t4xlyqp/babu_736302.large.jpeg
我已经尝试过搜索此问题,并且还检查了stackoverflow上的其他相关链接,
I've tried googling this problem and have checked out other related links on stackoverflow as well,
喜欢
,但问题仍然存在.
版本:
Django = 1.6.4
Django=1.6.4
枕头= 2.4.0
在virtualenv中已设置了所有内容.请帮忙!
Everything has been setup inside virtualenv. Please help!
PS:我是Python/Django世界的新手
PS : I'm a newbie to the world of Python/Django
这是我的代码段:
import json
import os
import hashlib
from datetime import datetime
from operator import itemgetter
import random
from random import randint
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.http import (HttpResponse, HttpResponseRedirect)
from django.core.context_processors import csrf
from django.core.files.images import get_image_dimensions
from django.shortcuts import render, redirect
from django.forms.models import model_to_dict
from django.views.decorators.csrf import csrf_exempt
from PIL import Image, ImageOps
from django.views.decorators.csrf import csrf_exempt, csrf_protect
import settings
from hashlib import md5
from django import forms
from beardedavenger.models import *
from django.views.decorators.http import require_POST
import pdb
import requests
def imagehandler(requests):
if requests.method == 'POST':
filename = requests.FILES['file'].name
file_extension = filename.split('.')[len(filename.split('.')) - 1].lower()
errors = []
username = 'nit'
global random
#allowed image types are png, jpg, jpeg, gif
if file_extension not in settings.IMAGE_FILE_TYPES:
errors.append('The image file you provided is not valid. Only the following extensions are allowed: %s' % ', '.join(settings.IMAGE_FILE_TYPES))
else:
image = requests.FILES['file']
image_w, image_h = get_image_dimensions(image)
rand = str(random.randint(100000,999999))
with open(settings.MEDIA_ROOT + username + '_' + rand + '.jpeg', 'wb+') as destination:
for chunk in requests.FILES['file'].chunks():
destination.write(chunk)
large_size = (1920, 1200)
infile = settings.MEDIA_ROOT + username + '_' + rand + ".jpeg"
large_file = settings.MEDIA_ROOT + username + '_' + rand +".large"
try:
im = Image.open(infile)
base_width = large_size[0]
aspect_ratio = float(image_w / float(image_h))
new_height = int(base_width / aspect_ratio)
if new_height < 1200:
final_width = base_width
final_height = new_height
else:
final_width = int(aspect_ratio * large_size[1])
final_height = large_size[1]
final_size = (final_width, final_height)
imaged = im.resize((final_width, final_height), Image.ANTIALIAS)
# imaged = ImageOps.fit(im, final_size, Image.ANTIALIAS, centering = (0.5,0.5))
imaged.save(large_file, "JPEG", quality=90)
except IOError:
errors.append('error while resizing image')
if not errors:
response = HttpResponse(json.dumps({'status': 'success','filename': filename }),
mimetype="application/json")
else:
response = HttpResponse(json.dumps({'status': 'failure','errors': errors,'message': 'Error uploading Picture. '}),
mimetype="application/json")
return response
else:
return render(requests, 'upload.html')
更新:
我正在使用Pillow调整大小和压缩图像.即使保持了宽高比,在调整大小后,图像中仍会引入一定的暗淡度[与原始图像相比,抗锯齿比所需的要多].我将处理库与Wand API(docs.wand-py.org/en/0.3.7/index.html)一起切换到了ImageMagick(针对许多建议不要这样做的帖子),以处理我的图像.这种变化就像一个魅力!
I was using Pillow to resize and compress my images. Even though the aspect ratio was maintained, there was a certain amount of dullness introduced in the images upon resizing [had more anti-aliasing than required as compared to original images]. I switched my processing library to ImageMagick(against numerous posts suggesting not to!) along with Wand API (docs.wand-py.org/en/0.3.7/index.html), to process my images. This change worked like a charm!
推荐答案
使用此代码,我得到了没有像素化的图像(Python 2.7,Pillow 2.4.0).
With this code I get this image (Python 2.7, Pillow 2.4.0) which has no pixelating.
from PIL import Image
large_size = (1920, 1200)
im = Image.open("babu_980604.jpeg")
image_w, image_h = im.size
aspect_ratio = image_w / float(image_h)
new_height = int(large_size[0] / aspect_ratio)
if new_height < 1200:
final_width = large_size[0]
final_height = new_height
else:
final_width = int(aspect_ratio * large_size[1])
final_height = large_size[1]
imaged = im.resize((final_width, final_height), Image.ANTIALIAS)
imaged.show()
imaged.save("out.jpg", quality=90)
此代码与您的代码之间的主要区别在于,它直接从打开的图像中获取 image_w
和 image_h
,而不是 get_image_dimensions(image)
,其实现未显示.
The main difference between this and your code is it gets image_w
and image_h
directly from the opened image instead of get_image_dimensions(image)
, whose implementation is not shown.
代码中的一些小问题:
-
您可以在
之前使用open(...)
设置infile
,并在那里使用它.
You could set
infile
before thewith open(...)
and use it there too.
final_size
未使用,可以将其删除,也可以在 im.resize()
中使用它.
final_size
isn't used and can be removed, or otherwise use it in im.resize()
.
base_width
可以替换为 large_size [0]
,因为您还可以在其他地方使用 large_size [1]
.
base_width
could be replaced by large_size[0]
, as you also use large_size[1]
elsewhere.
image
设置为 requests.FILES ['file']
,但您也可以使用 requests.FILES ['file']
直接.您可以重用 image
.
image
is set to requests.FILES['file']
but you also use requests.FILES['file']
directly. You could reuse image
.
全局随机
.
这篇关于枕头调整像素化图像的大小-Django/枕头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!