1

ImageMagickには、画像をグレースケールの「マスク」に「ラップ」するクールなテクニックがあります。サムネイルのクールなボタン効果を作成します。ImageMagickで行ったメソッドをPILに変換するための支援が必要です。ImageMagickのラッパーは使いたくありません。これをPILで再作成する必要があります。伝統的なマスクは使いたくない。PILにはこの効果を再現するのに十分な機能がありますか?

ImageMagickのオリジナル:http: //www.imagemagick.org/Usage/thumbnails/#badge_lighting

私はスケーリングや線画のような基本的なImageMagickとPILにかなり精通していますが、この例は複雑な側面にあります。支援できるPILの専門家はいますか?

ImageMagickソース

# merge "mask 'n' paint" images with a gray image,
# to create a "lighting mask"
convert -size 90x90 xc:gray50 -alpha set \
      badge_mask.png -compose DstIn -composite \
      badge_shading.png -compose Over -composite \
      badge_lighting.png

# Apply the single "lighting mask"
convert thumbnail.gif -alpha set -gravity center -extent 90x90 \
      badge_lighting.png \
      \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
      -delete 0 -compose In -composite \
      badge_final.png

入力RGBimageA(おそらくjpg)

入力RGBAimageB(pngファイル-グレースケールまたはチャネルはに変換されます)

RGBA結果画像(pngファイル)を出力

4

1 に答える 1

1

これは imagemagick が行うこととまったく同じではないかもしれませんが、結果は非常に似ています。関数 ( transparent_when_gray) を使用してバッジ テンプレートのピクセル値を変換し、127 (バッジ テンプレートの「ベース」カラー) に対して完全に透明で、値が大きくなったり小さくなったりすると不透明になるアルファ マスクを作成しました。次に、このアルファ マスクを使用して、バッジ テンプレートとソース イメージを合成します。

import Image, ImageChops, ImageOps

def transparent_when_gray(x):
    return 255 if x == 127 else 255 - 2 * abs(127 - x)

def mk_badge(img, template):
    templ = template.convert('RGBA')
    r, g, b, alpha = templ.split()
    gray = ImageOps.grayscale(Image.merge('RGB', (r, g, b)))
    amask = gray.point(transparent_when_gray)

    res = ImageChops.composite(img, templ, amask)
    res.putalpha(alpha)
    return res

if __name__ == '__main__':
    image    = Image.open('thumbnail.gif')
    template = Image.open('badge_lighting.png')

    image_cropped = ImageOps.fit(image, template.size)

    badge = mk_badge(image_cropped, template)
    badge.save('badge.png')
于 2012-08-20T15:12:04.400 に答える