Image process tools

#!/usr/bin/env python
# -*- coding: cp936 -*-


import gtk
import Image
import sys
import itertools




class PyApp(gtk.Window, gtk.HScrollbar, gtk.VScrollbar):
    def __init__(self):
        super(PyApp, self).__init__()
        
        self._title = u'图像编辑软件'
        self._vbox = gtk.VBox(False, 2)
        self._menu = None
        self._toolbar = None
        self._hscale = None
        self._image_control = gtk.Image()
        self._image_file = ''
        self._image = None
        self._image_changed = None
        self._file_name = ''
        self._size_label = '(0:0)'
        self._size_label_control = None
        
        self.set_title(self._title)
        self.set_size_request(1150, 750)
        self.set_resizable(True)
        self.set_border_width(8)
        self.set_position(gtk.WIN_POS_CENTER)
        try:
            self.set_icon_from_file("program.bmp")
        except Exception, e:
            print e.message
            sys.exit(1)
        
        self.Menu()
        self.Toolbar()
        self.HScale()
        
        sw = gtk.ScrolledWindow(None, None)
        sw.set_shadow_type(gtk.SHADOW_ETCHED_OUT)
        sw.set_border_width(1)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        sw.set_size_request(250, 550)
        sw.add_with_viewport(self._image_control)
        sw.set_tooltip_text(u'显示图像区域')
        
                
        table = gtk.Table(4, 11, False)
        
        table.set_col_spacings(3)
        title = gtk.Label(u'显示')
        halign = gtk.Alignment(0, 0, 0, 0)
        halign.add(title)
        table.attach(halign, 0, 1, 0, 1, gtk.FILL, gtk.FILL, 0, 0)
        
        table.attach(sw, 0, 3, 1, 2, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND, 1, 1)
        
        self._size_label_control = gtk.Label(self._size_label)
        self._size_label_control.set_tooltip_text(u'图像分辨率大小')
        valign_size = gtk.Alignment(0, 0, 0, 0)
        valign_size.add(self._size_label_control)
        self._size_label_control.set_size_request(300,30)
        
        table.attach(valign_size, 1, 2, 2, 3, gtk.FILL, gtk.FILL | gtk.EXPAND, 1, 1)  #gtk.SHRINK
        
        valign_preview = gtk.Alignment(0, 0, 0, 0)
        previewb = gtk.Button(u'预览')
        previewb.set_size_request(70, 30)
        valign_preview.add(previewb)
        previewb.connect("clicked", self.on_preview)
        table.attach(valign_preview, 2, 3, 3, 4, gtk.FILL, gtk.SHRINK, 1, 1)


        table.set_row_spacing(3, 6)
        valign_hscale = gtk.Alignment(0, 0, 0, 0)
        valign_hscale.add(self._hscale)
        table.attach(valign_hscale, 1, 2, 3, 4, gtk.FILL, gtk.FILL, 0, 0)
        
        self._vbox.pack_start(self._menu, False, False, 0)
        self._vbox.pack_start(self._toolbar, False, False, 0)
        self._vbox.pack_start(table, False, False, 0)
        self.add(self._vbox)
        
        self.connect("destroy", gtk.main_quit)
        self.show_all()
        
    def Menu(self):
        self._menu = gtk.MenuBar()
        filemenu = gtk.Menu()
        filemenua = gtk.Menu()
        filem = gtk.MenuItem(u'_文件')
        filema = gtk.MenuItem(u'_帮助')
        filem.set_submenu(filemenu)
        filema.set_submenu(filemenua)
        agr = gtk.AccelGroup()
        self.add_accel_group(agr)
        
        openm = gtk.ImageMenuItem(gtk.STOCK_OPEN, agr)
        key, mod = gtk.accelerator_parse("<Control>O")
        openm.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        openm.connect("activate", self.on_open)
        filemenu.append(openm)
        
        closem = gtk.ImageMenuItem(gtk.STOCK_CLOSE, agr)
        key, mod = gtk.accelerator_parse("C")
        closem.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        closem.connect("activate", self.on_close)
        filemenu.append(closem)
        sep = gtk.SeparatorMenuItem()
        filemenu.append(sep)
        
        savem = gtk.ImageMenuItem(gtk.STOCK_SAVE, agr)
        key, mod = gtk.accelerator_parse("<Control>S")
        savem.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        savem.connect("activate", self.on_save)
        filemenu.append(savem)
        
        saveasm = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS, agr)
        key, mod = gtk.accelerator_parse("A")
        saveasm.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        saveasm.connect("activate", self.on_saveas)
        filemenu.append(saveasm)
        sep = gtk.SeparatorMenuItem()
        filemenu.append(sep)
        
        exit = gtk.ImageMenuItem(gtk.STOCK_QUIT, agr)
        key, mod = gtk.accelerator_parse("<Control>Q")
        exit.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        exit.connect("activate", gtk.main_quit)
        filemenu.append(exit)
        
        aboutm = gtk.ImageMenuItem(gtk.STOCK_ABOUT, agr)
        key, mod = gtk.accelerator_parse("B")
        aboutm.add_accelerator("activate", agr, key, mod, gtk.ACCEL_VISIBLE)
        aboutm.connect("activate", self.on_about)
        filemenua.append(aboutm)
        
        self._menu.append(filem)
        self._menu.append(filema)
        
    def Toolbar(self):
        self._toolbar = gtk.Toolbar()
        self._toolbar.set_style(gtk.TOOLBAR_ICONS)
        
        opentb = gtk.ToolButton(gtk.STOCK_OPEN)
        opentb.set_tooltip_text(u'打开')
        closetb = gtk.ToolButton(gtk.STOCK_CLOSE)
        closetb.set_tooltip_text(u'关闭')
        savetb = gtk.ToolButton(gtk.STOCK_SAVE)
        savetb.set_tooltip_text(u'保存')
        saveastb = gtk.ToolButton(gtk.STOCK_SAVE_AS)
        saveastb.set_tooltip_text(u'另存为')
        sep = gtk.SeparatorToolItem()
        quittb = gtk.ToolButton(gtk.STOCK_QUIT)
        quittb.set_tooltip_text(u'退出')
        
        self._toolbar.insert(opentb, 0)
        self._toolbar.insert(closetb, 1)
        self._toolbar.insert(sep, 2)
        self._toolbar.insert(savetb, 3)
        self._toolbar.insert(saveastb, 4)
        self._toolbar.insert(sep, 5)
        self._toolbar.insert(quittb, 6)
        
        opentb.connect("clicked", self.on_open)
        closetb.connect("clicked", self.on_close)
        savetb.connect("clicked", self.on_save)
        saveastb.connect("clicked", self.on_saveas)
        quittb.connect("clicked", gtk.main_quit)
    
    def HScale(self):
        self._hscale = gtk.HScale()
        self._hscale.set_range(1, 30)
        self._hscale.set_increments(1, 2)
        self._hscale.set_digits(0)
        self._hscale.set_size_request(300, 30)
        self._hscale.set_tooltip_text(u'图像缩放比例')
        self._hscale.connect("value-changed", self.on_changed)
        
    def on_changed(self, widget):
        size = widget.get_value()
        size = 1 / size
        self._image_changed = self._image
        w,h = self._image_changed.size
        w,h = int(w*size),int(h*size)
        print(w, h)
        self._image_changed = self._image_changed.resize((w,h))
        self._image_changed.save(r'C:\WINDOWS\Temp\t.jpg')
        
        file_temp = gtk.gdk.pixbuf_new_from_file(r'C:\WINDOWS\Temp\t.jpg')
        self._image_control.set_from_pixbuf(file_temp)
        
        self._size_label = str(self._image_changed.size).replace(',', ':')
        self._size_label_control.set_label(self._size_label)
        
    def on_open(self, widget):
        filter_name1 = [u'位图文件(*.bmp)', u'JPEG(*.JPG;*.JPEG;*.JPE;*.JFIF)', u'GIF(*.GIF)', u'TIFF(*.TIF;*.TIFF)'
                , u'PNG(*.PNG)', u'ICO(*.ICO)', u'所有文件']
        filter_name2 = [[u'*.bmp'], [u'*.JPG', u'*.JPEG', u'*.JPE', u'*.JFIF'], [u'*.GIF'], [u'*.TIF', u'*.TIFF'], [u'*.PNG'], [u'*.ICO'], [u'*']]
       
        dialog = gtk.FileChooserDialog(u'打开', None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,  gtk.RESPONSE_OK))
        
        for name1, name2 in itertools.izip(filter_name1, filter_name2):
            filter = gtk.FileFilter()
            filter.set_name(name1)
            for name3 in name2:
                filter.add_pattern(name3)
            dialog.add_filter(filter)
        res = dialog.run()
        if res == gtk.RESPONSE_OK:
            file_name = dialog.get_filename()
            self._file_name = file_name
            #print(file_name)
        dialog.destroy()
        
        self._image = Image.open(file_name)
        self._image_changed = self._image
        
        self._size_label = str(self._image.size).replace(',', ':')
        self._size_label_control.set_label(self._size_label)
        
        file_temp = gtk.gdk.pixbuf_new_from_file(file_name)
        self._image_control.set_from_pixbuf(file_temp)
        
    def on_close(self, widget):
        self._image = None
        self._image_changed = None
        self._image_control.set_from_pixbuf(None)
        
    def on_save(self, widget):
        self._image_changed.save(self._file_name)
    
    def on_saveas(self, widget): 
        dialog = gtk.FileChooserDialog(u'另存为', None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,  gtk.RESPONSE_OK))
       
        res = dialog.run()
        if res == gtk.RESPONSE_OK:
            file_name = dialog.get_filename()
            if(-1 == file_name.rfind('.')):
                file_name += self._file_name[self._file_name.rfind('.'):]
                print(file_name)
            self._image_changed.save(file_name)
        dialog.destroy()
        
    def on_preview(self, widget):
        self._image_changed.show()
        
    def on_about(self, widget):
        about = gtk.AboutDialog()
        about.set_program_name(u'图像编辑软件')
        about.set_version("1.0.1")
        about.set_copyright(u'(C) 科技有限公司')
        about.set_comments(u'编辑图像分辨率使其调整所需大小、实时显示、预览')
        #about.set_website("http://www.sggg.com")
        about.set_position(gtk.WIN_POS_CENTER)
        about.set_logo(gtk.gdk.pixbuf_new_from_file("about.bmp"))
        about.run()
        about.destroy()
                
    def main(self):
        gtk.main()
        
        
pyApp = PyApp()
pyApp.main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值