2013-05-31 23 views
-1

我在找東西,可以生成一個雜誌封面 的圖像,我可以添加一些內容的亮點。 什麼是做這份工作的最好的圖書館? 它是PIL嗎?或imagemagick?如何使用python生成雜誌封面?

+3

請定義「雜誌封面」。 – 2013-05-31 13:31:50

+2

請爲此定義「生成」... –

+1

如果您只是想將某些文本疊加到圖像上,那麼PIL就可以工作。我對ImageMagick瞭解不多。對於更復雜的情況,您最好使用適當的DTP軟件包。 – Aya

回答

7

我很驚訝你想用程序設計雜誌封面,而不是像Photoshop,Illustrator,Gimp或Inkscape這樣的GUI。但是,假設你這麼做,我認爲最簡單的方法是使用Python來構建一個SVG圖像。 SVG是基於矢量的(線位置可以在修改後修改)和人類可讀的XML,因此您可以在Python中自動生成圖形和在Inkscape中手動編輯它們。 Python具有良好的操作XML的工具built-inthird-party,對此,SVG只是一個特例。

以編程方式生成圖像可能會涉及到大量的反覆試驗,因此我建議您使用交互式查看器進行設置。這裏有一個簡單的使用GTK(如在Ubuntu,apt-get install python-rsvg python-cairo):

import cairo 
import rsvg 
import gtk 

class Viewer(object): 
    def __init__(self): 
     self.string = """<svg width="800" height="600"></svg>""" 
     self.svg = rsvg.Handle(data=self.string) 
     self.win = gtk.Window() 
     self.da = gtk.DrawingArea() 
     self.win.add(self.da) 
     self.da.set_size_request(800, 600) 
     self.da.connect("expose-event", self._expose_cairo) 
     self.win.connect("destroy", self._destroy) 
     self.win.show_all() 
     self.win.present() 

    def _expose_cairo(self, win, event): 
     self.svg = rsvg.Handle(data=self.string) 
     cr = self.da.window.cairo_create() 
     self.svg.render_cairo(cr) 

    def _destroy(self, widget, data=None): 
     gtk.main_quit() 

    def renderSVG(self, text): 
     x, y, w, h = self.win.allocation 
     self.da.window.invalidate_rect((0,0,w,h), False) 
     self.string = text 

現在你可以用命令建立的圖形像

viewer = Viewer() # pops up a window 
import lxml.etree as etree 
from lxml.builder import E as svg 

rectangle = svg.rect(x="10", y="10", width="80", height="80", style="fill: yellow; stroke: black; stroke-width: 2;") 
circle = svg.circle(cx="70", cy="70", r="30", style="fill: red; fill-opacity: 0.5; stroke: black; stroke-width: 2;") 

document = svg.svg(rectangle, circle, width="100", height="100") 

viewer.renderSVG(etree.tostring(document)) # draws the image in the window 

,並將它們保存與

open("outputFile.svg", "w").write(etree.tostring(document)) 

位圖PNG通過使用Base64對其進行編碼,可以將圖像編碼爲href:data屬性,從而將圖像嵌入到SVG中。這需要長時間的解釋,但我只是讓你知道這是可能的。此外,SVG支持您期望在閃亮雜誌封面上的所有光滑漸變和混合效果,但您必須深入研究文檔以瞭解其工作方式。

+1

+1。這是需要對SO進行更多支持的那種深思熟慮的答案。 – iruvar

+0

非常感謝您提供這樣一個全面的答案,這正是我正在尋找的。 – flyingfoxlee