- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 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_w
和 image_h
而不是 get_image_dimensions(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/
为什么这个脚本不起作用?仅当页面宽度超过 915 像素时,我希望单击按钮时滚动页面 100 像素。我试图通过仅在宽度超过 915 像素时允许该函数运行来实现此目的,但它没有发生。怎么办? $(docu
我需要您帮助我建立一个网站。我是一个新手,已经得到了一个设计为 900 像素宽的主体,但他们给了我一个 1200 像素宽的图像。他们希望图像跨越整个 1200 像素的宽度,因此页面两侧基本上会有 30
我有一个在 y 轴上展开的 UIScrollview 并调用这个委托(delegate)方法: -(void)scrollViewDidScroll:(UIScrollView *)scrollVie
我有一个固定的标题这个标题在我滚动时改变高度和图像标志但是当我调整窗口大小时我希望图像保持比例但随着我缩小浏览器而变得更小标志只有在限制时缩小浏览器靠近图像,但我希望在调整浏览器大小时图像变小。 我该
在我的项目中,我使用 ArcGIS API for JavaScript https://developers.arcgis.com/javascript/但是对于(在这里插入非常大的坏词)我无法覆盖
有没有办法使用 jQuery,根据窗口滚动的距离做不同的事情? 这是我现在使用的代码; $(document).scroll(function() { // If scroll distanc
这基本上是 Jetpack Joyride 中运动的基本版本,但不是 Joyrider 以每秒 100 像素的速度下降,而是字母“x”从控制台的正中间以每秒 100 像素的速度下降和点击事件会导致它以
我像这样处理 MINMAXINFO: case WM_GETMINMAXINFO: { LPMINMAXINFO p_info = (LPMINMAXINFO)lPar
我对 javascript 有点陌生,我一直在查找 documentElement、clientWidth 和 clientHeight 并试图找出为什么它将我的 Canvas 设置为 300px x
我正在编写一些软件来读取 DICOM 文件,但我不确定如何处理具有未定义长度的标签。标准是这样说的 “如果值字段具有显式长度,则值长度字段应包含等于长度(以字节为单位)的值 值字段。否则,值字段 有一
我对 OpenGL 有点陌生,但我很确定我的问题在于所使用的像素格式,或者我的纹理是如何生成的...... 我正在使用 16 位 RGB5_A1 像素格式在平面 2D 四边形上绘制纹理,但在这个阶段我
有没有办法获取直播电视流,例如在像素级别上进行分析。 我的目标是检查直播电视流(例如使用java),例如广播电台 Logo 是否可见。 有机会通过 Google 电视观看此直播吗? 是否有机会通过笔记
我正在尝试构建一个函数,它以给定角度从特定坐标延伸,并循环遍历该线上的像素,直到遇到黑色像素. 如果角度为 180 度,这很容易实现。在这种情况下,搜索只会向下扩展,在每次迭代中将列坐标加 1。然而,
我已经研究了一段时间,但找不到任何解决方案。 这是我的代码 如果您将此代码复制并粘贴到本网站的 HTML 区域:http://jsfiddle.net/T3Nnu/3/ 如果您查看 Facebo
我有一个网页 - http://bit.ly/YHFX5B如果你看一下页脚,你会发现它后面有一些额外的白色像素/线条。我不明白他们是从哪里来的。 请告知他们可能来自哪里。 谢谢,丹 最佳答案 在 #f
如何在没有状态栏和操作栏的情况下获取屏幕高度(像素)或者如果有人告诉我如何获取状态栏和操作栏的高度,它也会有所帮助。我已经找到了屏幕高度,但它包括状态栏和操作栏.我将支持库 v7 用于操作栏。我在网上
Java 字符串根据宽度(像素)换行 在一些场景下,我们经常会通过判断字符串的长度,比如个数来实现换行,但是中文、英文、数字、其实在展示的时候同样长度的字符串,其实它的宽度是不一样的,这也是们我通
我创建了一个不错的简单可扩展列表。它应该像单选列表一样工作,您应该只能选择一个元素。我还没有实现这部分,因为我对列表的大小有疑问: class ExpandableListRadio extends
我使用以下代码滚动到元素顶部,但我想滚动到元素顶部上方 10px,不知道如何执行此操作,有什么建议吗?谢谢! $('html, body').stop(true,true).animate({
我有一个链接,可以在滚动时更改其垂直位置。当我点击此链接时,我想(平滑地)转到页面上的某个位置,该位置距离页面顶部正好 1080 像素。 我无法实现它,希望有人能帮助我。 链接: 脚本: $(do
我是一名优秀的程序员,十分优秀!