12

私は正方形のロゴを取得し、それをround_cornerする必要があり、しばらく検索して、次のコード「working」を取得しました。

def round_corner_jpg(image, radius):
    """generate round corner for image"""
    mask = Image.new('RGB', image.size)
    #mask = Image.new('RGB', (image.size[0] - radius, image.size[1] - radius))
    #mask = Image.new('L', image.size, 255)
    draw = aggdraw.Draw(mask)
    brush = aggdraw.Brush('black')
    width, height = mask.size
    draw.rectangle((0,0,width,height), aggdraw.Brush('white'))
    #upper-left corner
    draw.pieslice((0,0,radius*2, radius*2), 90, 180, None, brush)
    #upper-right corner
    draw.pieslice((width - radius*2, 0, width, radius*2), 0, 90, None, brush)
    #bottom-left corner
    draw.pieslice((0, height - radius * 2, radius*2, height),180, 270, None, brush)
    #bottom-right corner
    draw.pieslice((width - radius * 2, height - radius * 2, width, height), 270, 360, None, brush)
    #center rectangle
    draw.rectangle((radius, radius, width - radius, height - radius), brush)
    #four edge rectangle
    draw.rectangle((radius, 0, width - radius, radius), brush)
    draw.rectangle((0, radius, radius, height-radius), brush)
    draw.rectangle((radius, height-radius, width-radius, height), brush)
    draw.rectangle((width-radius, radius, width, height-radius), brush)
    draw.flush()
    del draw
    return ImageChops.add(mask, image)

次に、返された画像オブジェクトを保存しましたが、 このように隅に白い背景が あります。白い背景を取り除く、または非表示にするにはどうすればよいですか?よろしくお願いします〜

編集:これがfraxelによるコードです、ありがとう〜

def add_corners(im, rad):
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
    alpha = Image.new('L', im.size, "white")
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im


if __name__ == '__main__':
    im = Image.open('1.jpg')
    im = add_corners(im, 100)
    im.save('out.png')`

申し訳ありませんが、画像の形状を長方形ではなく楕円形にする必要があります。つまり、画像から書き込みを行う必要があります。@fraxelを使用すると、処理した画像の白い角がまだ表示されます。

4

2 に答える 2

29

まず、透明度をサポートする形式で画像を保存していることを確認してください。PNGする、JPGしない... 以下は、透明なコーナーを追加するかなり素敵なコードです。それはこのように動作します:

  1. radを使用して、半径 の円を描きますdraw.ellipse()
  2. 画像と同じサイズのアルファチャンネル用の画像を作成します
  3. 円を 4 つの部分 (丸みを帯びた角) に切り刻み、アルファ イメージの正しい角に配置します。
  4. を使用してアルファチャンネルを画像に入れますputalpha()
  5. として保存してpng、透明度を維持します。

コードは次のとおりです。

import Image, ImageDraw

def add_corners(im, rad):
    circle = Image.new('L', (rad * 2, rad * 2), 0)
    draw = ImageDraw.Draw(circle)
    draw.ellipse((0, 0, rad * 2, rad * 2), fill=255)
    alpha = Image.new('L', im.size, 255)
    w, h = im.size
    alpha.paste(circle.crop((0, 0, rad, rad)), (0, 0))
    alpha.paste(circle.crop((0, rad, rad, rad * 2)), (0, h - rad))
    alpha.paste(circle.crop((rad, 0, rad * 2, rad)), (w - rad, 0))
    alpha.paste(circle.crop((rad, rad, rad * 2, rad * 2)), (w - rad, h - rad))
    im.putalpha(alpha)
    return im

im = Image.open('tiger.jpg')
im = add_corners(im, 100)
im.save('tiger.png')

湾曲したエッジのトラの例:

ここに画像の説明を入力

これがあなたの画像で、このコードで処理され、透明なコーナーが与えられます:

ここに画像の説明を入力

于 2012-07-02T09:58:50.987 に答える
1

image.putalpha(mask)画像のアルファチャンネルをマスクに置き換えるようなことを試しましたか? これは、あなたが望むことをするべきだと思われます。maskこれが正しく機能するには「L」モードでimageある必要があり、おそらく「RGBA」である必要がありますが、自動的に変換される場合があります。

ここでの一番の答えは、いくつかの良い例を提供しています: PIL で円形のサムネイルを生成するにはどうすればよいですか?

マスク画像は問題ないように見えますが、「白」と「黒」を入れ替えたいと思うので、最終画像を黒の背景にしたい形状とまったく同じ白い角丸長方形を作成します。おそらく、「L」モード (グレースケール) も使用する必要があります。

この画像を取得したら、return ImageChops.add(mask, image)byimage.putalpha(mask); return imageを置き換えることができます。これにより、マスクの黒い領域でのみ画像が透明になります。

最初に画像を変換する必要があるかもしれませんが、image.convert('RGBA')これは PIL の以降のバージョンでは不要だと思います。自動的に行われます。

次のようなもの:(申し訳ありませんが、現在これをテストできません)

def round_corner_jpg(画像、半径):
    """画像の丸い角を生成"""
    mask = Image.new('L', image.size) # デフォルトで黒で塗りつぶされる
    draw = aggdraw.Draw(マスク)
    ブラシ = aggdraw.Brush('白')
    幅、高さ = mask.size
    #左上隅
    draw.pieslice((0,0,半径*2, 半径*2), 90, 180, なし, ブラシ)
    #右上隅
    draw.pieslice((幅 - 半径*2, 0, 幅, 半径*2), 0, 90, なし, ブラシ)
    #左下隅
    draw.pieslice((0, 高さ - 半径 * 2, 半径 * 2, 高さ),180, 270, なし, ブラシ)
    #右下隅
    draw.pieslice((幅 - 半径 * 2, 高さ - 半径 * 2, 幅, 高さ), 270, 360, なし, ブラシ)
    #中央の長方形
    draw.rectangle((半径, 半径, 幅 - 半径, 高さ - 半径), ブラシ)
    #四辺の長方形
    draw.rectangle((半径, 0, 幅 - 半径, 半径), ブラシ)
    draw.rectangle((0, radius, radius, height-radius), brush)
    draw.rectangle((radius, height-radius, width-radius, height), brush)
    draw.rectangle((幅-半径, 半径, 幅, 高さ-半径), ブラシ)
    draw.flush()
    image = image.convert('RGBA')
    image.putalpha(マスク)
    リターン画像
于 2012-07-02T03:57:13.983 に答える