gpt4 book ai didi

python - Pillow 调整像素化图像的大小 - Django/Pillow

转载 作者:太空狗 更新时间:2023-10-30 00:40:37 26 4
gpt4 key购买 nike

我正在用 Django 开发一个图片 uploader 。图片上传并保存到磁盘后,我正在尝试调整已保存图像的大小,同时保持其纵横比。我正在使用 Pillow 进行图像处理/调整大小。当我尝试调整图像大小时出现问题,即使调整后图像的纵横比与原始图像的纵横比相同,它也会像素化。

原始保存图像: https://www.dropbox.com/s/80yk6tnwt3xnoun/babu_980604.jpeg

调整大小的像素化图像: https://www.dropbox.com/s/bznodpk4t4xlyqp/babu_736302.large.jpeg

我尝试用谷歌搜索这个问题,并检查了 stackoverflow 上的其他相关链接,

喜欢

How do I resize an image using PIL and maintain its aspect ratio?

Resize image maintaining aspect ratio AND making portrait and landscape images exact same size?

但问题依然存在。

版本:

Django=1.6.4

Pillow =2.4.0

一切都已在 virtualenv 中设置。请帮忙!

PS:我是 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 来调整和压缩我的图像。尽管纵横比保持不变,但在调整大小时图像中引入了一定程度的暗淡 [与原始图像相比,具有比所需更多的抗锯齿]。我将我的处理库切换到 ImageMagick(许多帖子建议不要这样做!)以及 Wand API (docs.wand-py.org/en/0.3.7/index.html) 来处理我的图像。这个变化就像一个魅力!

最佳答案

通过这段代码,我得到了这张没有像素化的图像(Python 2.7,Pillow 2.4.0)。

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_wimage_h 而不是 get_image_dimensions(image),未显示其实现。

output image

代码中的一些小事:

  • 您可以在 with open(...) 之前设置 infile 并在那里使用它。

  • final_size 未使用,可以删除,或者以其他方式在 im.resize() 中使用它。

  • base_width 可以替换为 large_size[0],因为您还在别处使用 large_size[1]

  • image 设置为 requests.FILES['file'] 但您还使用 requests.FILES['file'] 直接。您可以重复使用 image

  • 全局随机可能不需要。

关于python - Pillow 调整像素化图像的大小 - Django/Pillow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23921745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com