discordでmake it a quoteをしたい(python)

# make it a quoteをdiscordpyでやりたい!
twitterに[make it a quote](https://mobile.twitter.com/MakeItAQuote)というbotがいる。
これをdiscordでやりたいと思った。
# まずすること
•discord.pyと画像処理用のpillowのインストール
`pip install discord.py`
`pip install pillow`
# コード
## botの基本部分
画像は最後にのせておきます
```py
import discord
from discord.ext import commands
from PIL import Image,ImageDraw,ImageFont
client=commands.Bot(command_prefix="^")
client.run(token)
```
## まずbotにコマンドを付けずにそのままやってみる
```py
from PIL import Image,ImageDraw,ImageFont
def adjust(content):
  msg=""
  for con in content:
    if len(msg)%9==8:
      msg+="\n"
    msg+=con
  return msg
#文字を8文字ごとに改行する
icon=Image.open("icon.jpeg")
background=Image.open("back.jpeg")
w,h=(680,370)#画像の大きさを揃えるため
background=background.convert("L")#白黒に変更
background=background.resize((w,h))#リサイズ
new=Image.new(mode="L",size=(w,h))#後でアイコンを貼り付ける
icon=icon.resize((h,h))#discordでは画像が正方形で返ってくるから
icon=icon.convert("L")
new.paste(icon)#貼り付ける
```
ここで困ったのがどのようにグラデーションを付けるかということ。
Image.blend()をしても白の部分で画像が明るくなってしまい、さらに画像に境目ができてしまう。
調べたところ,Image.composite()が使えそうだった。
## 続き
```py
black=Image.open("black.jpeg")
black=black.convert("L")
result=Image.composite(new,black,background)
```
ここまでで
![C1F1DA57-7989-4781-8380-619B9A15DE45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/0b2e9bc2-7d68-b568-ec91-655538f68f5b.png)
こうなると思います。

次に文字をつけていきたいと思います
```py
draw=ImageDraw.Draw(result)
fnt=ImageFont.truetype("#ここにはフォントをダウンロードしてください。おすすめはにじみ明朝というやつです",40)#フォントサイズ
draw.text((350,120),adjust("hahahahahaha"),font=fnt,fill="#FFF")
#文字の位置、テキスト、フォント、色
result.save("result.png")
```
ここまでくると
![8CAC0894-95F0-4C5A-8AD4-9939B5CD9B1A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/664c6700-f821-10ee-46cc-38f3b4d9064f.png)
こうなると思います。

# botのコマンドに追加
一番上のコードの続き
返信先を受け取るときはdiscord.Message.referenceで受け取ります
~~これを探すのに時間がかかった~~
```py
import requests
@client.command()
async def make_quote(ctx):
  msg=ctx.message.refernce
  id=msg.message_id
  message=await ctx.fetch_message(id)
  ico=message.author.avatar_url
  #アバターを保存する方法がわからなかったのでurlから保存しています
  url=ico
  fp="icon.jpeg"
  response=requests.get(url)
  image=response.content
  with open(fp,"wb") as aaa:
    aaa.write(image)

  def adjust(content):
      msg=""
      for con in content:
        if len(msg)%9==8:
          msg+="\n"
        msg+=con
      return msg

  icon=Image.open("icon.jpeg")
  background=Image.open("back.jpeg")
  black=Image.open("black.jpeg")
  w,h=(680,370)
  background=background.convert("L")
  background=background.resize((w,h))
  black=black.resize((w,h))
  new=Image.new(mode="L",size=(w,h))
  icon=icon.resize((h,h))
  icon=icon.crop((40,0,680,370))
#画像の左にアイコンの中心が来るよう調整
  icon=icon.convert("L")
  new.paste(icon)
  black=black.convert("L")
  result=Image.composite(new,black,background)
  draw = ImageDraw.Draw(result)
  fnt = ImageFont.truetype('nijimi.otf',40)
  cont=message.content
  author=message.author
  draw.text((350,120),adjust(cont),font=fnt,fill='#FFF') #fontを指定
  dr=ImageDraw.Draw(sa)
  font = ImageFont.truetype('nijimi.otf',25)
  dr.text((400,300),str(author),font=font,fill="#FFF")
  #authorの名前も入れます
  result.save("t.png")
  file=discord.File("t.png")
  await ctx.send(file=file)
```
こうすると
![5FA2C2B1-C6BD-404B-87D1-8976676DA8CF.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/48e41d3b-21a1-d6b1-474a-c5f5bdce8a01.jpeg)
のようになると思います。
切れ方がおかしいですがそこは文節で区切るbudouなどのパッケージを使ってもいいです
(名前は隠しています)
back.jpeg↓
![888F8AA9-D1B4-4329-8F8A-0F2F23AE9B87.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/e148783f-2f48-996c-0f0d-4dead2825c22.png)
icon.jpeg↓
![0D1C71FE-66E7-43A8-BC0F-3CB7E7EB62C1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/136c6833-4d8d-3edb-464d-83af0fb56825.jpeg)
black.jpeg↓
![5CCCB97F-C86C-477C-AF96-AC17B4A244D3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633675/a52cfe0e-c1eb-f166-5f0f-02d49b84b715.jpeg)
# 最後に
なかなかうまく再現できたんじゃないかと思います。
マークダウンが色々おかしいですが初めてなのでお願いします。
一応テスト用に作ったコードのせておきます。
```py
from PIL import Image,ImageDraw,ImageFont
def adjust(content):
  msg=""
  for con in content:
    if len(msg)%9==8:
      msg+="\n"
    msg+=con
  return msg
icon=Image.open("yamato.jpeg")
haikei=Image.open("grad.jpeg")
black=Image.open("black.jpeg")
print(haikei.size)
w,h=(680,370)
w1,h1=icon.size
haikei=haikei.convert("L")
haikei=haikei.resize((w,h))
black=black.resize((w,h))
new=Image.new(mode="L",size=(w,h))
icon=icon.resize((h,h))
icon=icon.convert("L")
new.paste(icon)
black=black.convert("L")
sa=Image.composite(new,black,haikei)
draw = ImageDraw.Draw(sa)# im上のImageDrawインスタンスを作る
fnt = ImageFont.truetype('nijimi.otf',40) #ImageFontインスタンスを作る
draw.text((350,120),adjust("hahahahahahahahah"),font=fnt,fill='#FFF') #fontを指定
sa.save("test.png")
```