KakegawaMakoto
@KakegawaMakoto (真 掛川)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Djangoでの属性がありませんについて

解決したいこと

DjangoでPILLOWを使って写真の色などを変更したい

発生している問題・エラー

anaconda3/envs/py36/lib/python3.7/site-packages/PIL/ImageEnhance.py", line 51, in __init__
    if "A" in image.getbands():
AttributeError: 'QuerySet' object has no attribute 'getbands'

例)

'QuerySet'オブジェクトには属性 'getbands'がありません

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

Views.py

from django.shortcuts import render
from django.http import HttpResponse
from.models import Photo
from django.conf import settings
from imagekit.processors import Adjust

import matplotlib.pyplot as plt # matplotlibを読み込んで、pyplotを pltという名
import cv2
from PIL import Image, ImageDraw
from PIL import ImageEnhance
import numpy as np


# Create your views here.

def index(request):
    if request.method == 'POST':
        form = Photo.objects.order_by('photo')
        if form.is_valid():
            form.save()
            return redirect('index')
    else:
        form = Photo
        #max_id = Photo.objects.latest('photo').id
        obj = Photo.objects.order_by('photo')
        #input_path = settings.BASE_DIR + obj.photo.url
        input_path = obj 
        #output_path = settings.BASE_DIR + "/media/output/output.jpg"
        #gray(input_path,output_path)

    return render(request, 'edits/index.html', {
        'edits': input_path,
        'edits':obj,
        'edits':saturations(input_path),
    })

def saturations(input_path):
    img = input_path
#    SATURATION = 0.2

    saturation_converter = ImageEnhance.Color(img)
    saturation = saturation_converter.enhance(SATURATION)
    saturation_img = saturation

    #plt.imshow(saturation_img)

    #saturation_img.save(output_path,saturation_img)

    return saturation_img




models.py

from django.db import models
# Create your models here.
class Photo(models.Model):
   photo = models.ImageField( upload_to='media/',)


自分で試したこと

Djangoを使って初めてのアプリ開発になります。勉強歴が浅く、コードが読みにくいかと思いますが、もし良ければヒント等でもいただけると嬉しいです。

0

2Answer

手元で動作確認していないので参考コードですが、


from PIL import Image, ImageEnhance
from django.conf import settings

photo = Photo.objects.first()
image = Image.open(settings.MEDIA_ROOT + photo.path)
saturation_converter = ImageEnhance.Color(img)
saturation_img = saturation_converter.enhance(SATURATION)

のようにすればいけないでしょうか。


1 ファイルのpathにアクセスするにはQuerySetではなくPhotoオブジェクトにアクセスする必要があるため、

Photo.objects.order_by('photo')

のようにレコード全体にアクセスする記法ではなく、その中から1つを指定するメソッドを付け加えて

Photo.objects.order_by('photo').latest()  # 1番目を取得
Photo.objects.order_by('photo')[5]  # 5番目を取得
Photo.objects.order_by('photo').first()  # 最後を取得

などを使用する必要があります

2 デフォルト設定を変更していなければ、ImageFieldのファイル保存場所の絶対pathは

settings.MEDIA_ROOT + photo.path

となります

3 DjangoのFileオブジェクトとPILのImageオブジェクトは別ものなので、Django Modelから取得したオブジェクトをそのままPILにわたすことはできないはずです。
PILのImageオブジェクトを生成してください。

image = Image.open(settings.MEDIA_ROOT + photo.path)
0Like

Comments

はい、そうです。

例えば下記のようになると思います

def index(request):
    if request.method == 'POST':
        # POSTの処理
    else:
        photo = Photo.objects.order_by('photo').first()

    return render(request, 'edits/index.html', {
        'edits':saturations(photo),
    })

def saturations(photo):
    img = Image.open(settings.MEDIA_ROOT + photo.path)
    saturation_converter = ImageEnhance.Color(img)
    return saturation_converter.enhance(SATURATION)
0Like

Comments

  1. @KakegawaMakoto

    Questioner

    ご丁寧にありがとうございます。いろいろと触ってみます!

Your answer might help someone💌