2012-10-02 54 views
3

我想在GAE上的圖像上覆蓋一些文本。現在他們公開了PIL庫,它不應該是問題。App引擎,PIL和覆蓋文本

這是我的。它的工作原理,但我不禁認爲我應該直接寫入背景圖像,而不是創建一個單獨的疊加圖像,然後合併。

我可以使用Image.frombuffer什麼的,我給它一去,但我只是沒有得到它...

from PIL import Image, ImageDraw, ImageFont 
from google.appengine.api import images 
from google.appengine.ext import blobstore 
from google.appengine.api import files 

def compose(key): 

    # create new image 
    text_img = Image.new('RGBA', (800,600), (0, 0, 0, 0)) 
    draw = ImageDraw.Draw(text_img) 
    draw.text((0, 0), 'HELLO TEXT', font=ImageFont.load_default()) 

    # no write access on GAE 
    output = StringIO.StringIO() 
    text_img.save(output, format="png") 
    text_layer = output.getvalue() 
    output.close() 

    # read background image 
    blob_reader = blobstore.BlobReader(key) 
    background = images.Image(blob_reader.read()) 

    # merge 
    merged = images.composite([(background, 0, 0, 1.0, images.TOP_LEFT), 
           (text_layer, 0, 0, 1.0, images.TOP_LEFT)], 
           800, 600) 

    # save 
    file_name = files.blobstore.create(mime_type='image/png') 
    with files.open(file_name, 'a') as f: 
     f.write(merged) 
    files.finalize(file_name) 
+0

Plz,你怎麼能在googleappengine上安裝PIL?謝謝 – armandomiani

回答

2

您應該使用[Image.open][1]方法來代替。 Image.frombufferImage.fromstring解碼像素數據而不是原始圖像。

在你的情況,你可以使用類似:

blob_reader = blobstore.BlobReader(key) 
text_img = Image.open(blob_reader) 
......... 
+0

我得到一個錯誤:'提高IOError(「無法識別圖像文件」)' – bradley

+0

你試圖加載什麼類型的圖像?你也可以嘗試使用下面的'text_img = Images.open(StringIO(blob_reader.read))'。 –

+0

他們只是標準的JPEG。我使用StringIO得到'TypeError:'模塊'對象不可調用'。 – bradley

0

要直接在背景圖像上畫將是最簡單的:

draw = ImageDraw.Draw(background) 
draw.text((0, 0), 'HELLO TEXT', font=ImageFont.load_default()) 
+0

這給了我這個錯誤:'AttributeError:'圖像'對象沒有屬性'load'' – bradley

2

您需要與PIL打開圖像,不應用程序引擎圖像類型(另一個答案已關閉一個字符:Image,而不是Images):

blob_reader = blobstore.BlobReader(key) 
text_img = Image.open(blob_reader)