2010-08-24 147 views
1

這是一個任務,我已經把好功夫,因爲我是新來的Python編程:圖像處理

我運行下面的函數,它發生在圖像和詞組(空格將被移除,以便只是文本)作爲參數,我已經得到了所有的導入和預處理代碼,我只需要實現這個功能。我只能使用getpixel,putpixel,加載和保存。這就是爲什麼編碼對我來說是一項艱鉅的任務。

def InsertoImage(srcImage, phrase): 
    pix = srcImage.load() 
    for index,value in enumerate(phrase): 
     pix[10+index,15] = phrase[index] 
    srcImage.save() 
pass 

這段代碼是給 「系統錯誤」,它說: 「新的風格getargs格式,但說法並不元組」

編輯:

C:\Users\Nave\Desktop\a1>a1_template.py lolmini.jpg Hi 
Traceback (most recent call last): 
    File "C:\Users\Nave\Desktop\a1\a1_template.py", line 31, in <module> 
    doLOLImage(srcImage, phrase) 
    File "C:\Users\Nave\Desktop\a1\a1_template.py", line 23, in doLOLImage 
    pix[10+index,15] = phrase[index] 
SystemError: new style getargs format but argument is not a tuple 

編輯:

好,謝謝,我明白,現在發佈代碼,但我得到錯誤的if語句不知道爲什麼if語句不工作,這裏是完整的代碼對不起,因爲沒有完全添加它:

未來進口部

字母,數字和punctation是字典映射(大寫)

人物形象,表示字符

注:沒有存儲任何空格字符!

從imageproc進口字母,數字,標點符號,預處理

這是貫徹落實

高清InserttoImage功能(srcImage,詞組):
PIX = srcImage.load()
索引,在枚舉值(詞組):
如果在字母值:
PIX [10 +指數,15] =信[值]在數字
elif的值:
PIX [10 +指數,15] =號碼[值]在標點
elif的值: PIX [10 +指數,15] =標點符號[值]
srcImage.save()

這當該腳本的命令行經由被稱爲執行碼:

'蟒的.py'

如果 == '':
srcImage,短語=預處理()
InserttoImage(srcImage,詞組)

謝謝,字母,數字和標點是字典,其看到所述鍵元件和打開圖像(字體)。 但仍有與PIX [10 +指數,15],因爲它是給錯誤的問題:

pix[10+index, 15] = letters[value] 

關於SystemError:新型getargs格式,但參數是不是一個元組

+0

哪種說法給人的錯誤?你能編輯你的文章以包含完整的回溯? – 2010-08-24 02:13:56

+0

我編輯並提供了錯誤消息。 – nman84 2010-08-24 02:35:24

+0

我在閱讀答案後發佈了更新後的代碼,但是在if語句中顯示錯誤 – nman84 2010-08-24 03:55:12

回答

0

其實,在進一步閱讀,我認爲問題在於您正在嘗試將字符值分配給像素。你必須想出一些方法來真實地繪製圖像上的字符(以及圖像邊界內)。

另外,作爲一個側面說明,因爲你正在使用 索引,在枚舉值(短語):

你可以使用值的代替短語[指數]

+0

謝謝我用兩種方式嘗試: 如果我使用pix [(10 +索引,15)]我得到此錯誤: 文件「C:\用戶\ Nave \桌面\ a1 \ a1_template.py」,第23行,在doLOLImage pix [(10 + index,15)] = phrase [index] SystemError:新樣式getargs格式但參數不是元組 如果我使用pix [10 + index] [15] : 文件「C:\ Users \ Nave \ Desktop \ a1 \ a1_template.py」,行23,在doLOLImage pi x [10 + index] [15] =短語[index] TypeError:參數必須是長度爲2的序列 – nman84 2010-08-24 02:56:57

+0

是的,我很抱歉,當我說這些時,我並沒有真正在想。我編輯了我的問題。我希望它有一點幫助,我試圖故意模糊,因爲它是作業:) – GWW 2010-08-24 03:01:04

+0

你能否請我建議我如何繪製圖像上的字符,作業只允許我使用getpixel,putpixel,加載並保存圖像函數在Python圖像庫。 – nman84 2010-08-24 03:17:43

2

你似乎是混淆兩個非常不同的概念。從您發佈的示例代碼開始,我們假設:

srcImage =從lolmini.jpg生成的Python圖像庫圖像。
phrase =一個字符串,'Hi'。

您正在嘗試讓phrase顯示爲寫在srcImage之上的文字。您當前的代碼顯示您計劃通過訪問圖像的各個像素併爲其分配一個字母來做到這一點。

這不起作用的原因有幾個。主要的兩個是:

  • 您正在使用單個像素。像素是圖片元素。它一次只顯示一種顏色。你不能用一個像素表示一個字母。像素只是一個點。你需要將多個像素結合在一起,形成一個我們認爲是字母的連貫形狀。

  • Hi實際上看起來像什麼?當你想象它被寫在圖像的頂部時,這些字母是薄的嗎?他們的尺寸有多大?它們厚實而厚實?斜體?他們看起來手寫嗎?這些都是字體臉部的全部屬性。目前,你的程序不知道這些字母應該是什麼樣子。您需要爲程序指定字體的名稱,以便它知道如何從phrase中將字母繪製到圖像上。

Python Imaging Library附帶一個專門用於幫助您繪製字體的模塊。它的文檔是在這裏:
The ImageFont Module

您的代碼表明,你必須通過每個字母的總體思路正確—循環,把它的形象,並增加X值,以使下一個字母沒有按」 t重疊它。不過,不需要使用圖像的像素,但需要加載字體並使用上述鏈接庫中顯示的方法將它們繪製到圖像上。

如果您看一下鏈接文檔中的draw.text()函數,您會發現實際上可以跳過循環遍歷每個字母的需要,而不是傳遞要在圖像上使用的整個字符串。

我可以添加示例代碼,但由於這是我故意留下的作業任務。通過鏈接的文檔和現有的代碼,希望不會有任何麻煩看到完成。

編輯

只要閱讀到另一個回答您的評論,表示你只被允許使用getpixel()putpixel()繪製到源圖像。如果確實如此,您的工作量就會呈指數級增長。

我上面的評論立場—一個像素將無法表示一個字母。假設您不允許任何外部源代碼,您將需要創建包含多個像素位置的數據結構,然後將這些像素全部繪製在特定位置以表示特定字母。

然後你需要爲你想要支持的每一個字母做這件事。

如果您可以逐字包括作業的文本,我認爲這將有助於在這裏更好地理解您的所有約束。

0

我對一般問題的建議是在已知座標(上,下,左,右)處創建一個包含所有字符的圖像,然後將字符圖像的相應部分轉移到新的輸出圖像中。

0

就試試這個: pix[10+index:15] = letters[value] 使用 「」,而不是 「