基于WxPython的批量图片缩放工具

    (说明: 这是我2007年写在cublog(China Unix)上的博客,现在把它转到这里来.) 

    经常有人抱怨,在QQ上互传照片的时候因为照片太大而速度极慢[普通500万数码相机拍下来的最大分辨率照片通常为3M]。其实过多的分辨率对图像质量并没有对视觉上产生很大影响,比如1024x768的图片用来传给远方的朋友已经足够了,而大小仅有几百k。所以只要把图片缩小为原来的n倍、占用的空间将是原图的n*n分之一(原理上是这样的,但是对于jpeg压缩,压缩将比取决于图像细节等因素,但肯定是会有减无增的,呵呵)。
    而使用windows的绘图程序或photoshop又太慢[只能一张一张地转换],需要一个能批量缩放图片的工具,于是我使用wxpython写了一个批量图片缩放工具(同时也是一个图片浏览工具哦)。
    关键函数:
    1,图像打开和浏览

    

def OnButton1LeftUp(self, event):#浏览下一幅图片
        if self.index > 0:
            self.index -= 1          #图像次序减一
            im = Image.open(self.images[self.index])
            self.imagesize = im.size
            im = im.resize((320, 240))
            im.save(self.tempimage,'JPEG')
            self.bitmapPic.SetBitmap(bitmap=wx.Bitmap(self.tempimage,
                                            wx.BITMAP_TYPE_JPEG)) 
            self.staticTextWidth.SetLabel('\xb3\xa4\xa3\xba    ' +
                                            str(self.imagesize[0]))
            self.staticTextHeight.SetLabel('\xbf\xed\xa3\xba    ' +
                                            str(self.imagesize[1]))
            self.saveSize = self.imagesize
            self.SetSaveSizeText()
            del im
        event.Skip() 
    def OnButton2LeftUp(self, event):  #浏览上一幅图片
        if self.index < self.count - 1:  
            self.index += 1            #图像次序加一
            im = Image.open(self.images[self.index])
            self.imagesize = im.size
            im = im.resize((320, 240))
            im.save(self.tempimage,'JPEG')
            self.bitmapPic.SetBitmap(bitmap=wx.Bitmap(self.tempimage,
                          wx.BITMAP_TYPE_JPEG))   
            self.staticTextWidth.SetLabel('\xb3\xa4\xa3\xba    ' +
                                            str(self.imagesize[0]))
            self.staticTextHeight.SetLabel('\xbf\xed\xa3\xba    ' +
                                            str(self.imagesize[1]))
            self.saveSize = self.imagesize
            self.SetSaveSizeText()
            del im
        event.Skip()
    def OnBtnOpenLeftUp(self, event):   #打开图片[多个]
        dlg = wx.FileDialog(             #打开文件对话框
            self, message="Please choose images",
            defaultDir=os.getcwd(), 
            defaultFile="*.jpg",
            wildcard=wildcard,
            style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
            )

        if dlg.ShowModal() == wx.ID_OK:
            self.images = dlg.GetPaths()
            self.count = len(self.images)
            if self.count == 0:
                dlg.Destroy()
                event.skip()
            
            im = Image.open(self.images[0])
            self.imagesize = im.size
            im = im.resize((320, 240))        #图片缩放,以适合staticBitmap
            im.save(self.tempimage,'JPEG')
            self.bitmapPic.SetBitmap(bitmap=wx.Bitmap(self.tempimage,
                                    wx.BITMAP_TYPE_JPEG))   
            self.staticTextWidth.SetLabel('\xb3\xa4\xa3\xba        ' +
                                             str(self.imagesize[0]))
            self.staticTextHeight.SetLabel('\xbf\xed\xa3\xba        ' +
                                                str(self.imagesize[1]))
            self.staticTextSrc.SetLabel("From:" + dlg.GetDirectory())
            self.staticTextCnt.SetLabel('\xca\xfd\xc1\xbf:        '+
                                                str(self.count))
            self.saveSize = self.imagesize
            self.SetSaveSizeText()
            dlg.Destroy()
            del im
        event.Skip()
    def SetSaveSizeText(self):     
        self.textCtrlWidth.SetValue(str(self.saveSize[0]))
        self.textCtrlHeight.SetValue(str(self.saveSize[1]))
     2,图像的批量缩放和格式变换,目前支持jpg图片和bmp图片

    

def OnBtnSaveLeftUp(self, event):  #保存按钮
        dlg = wx.FileDialog(
            self, message="Save image file as ...", defaultDir=os.getcwd(), 
            defaultFile="All.jpg",wildcard="" , style=wx.SAVE
            )
        if dlg.ShowModal() == wx.ID_OK:
            self.savedir = dlg.GetDirectory()
            self.staticTextDest.SetLabel("To:" + self.savedir)
            self.convert()      #调用convert函数
        dlg.Destroy()
        event.Skip()
    def convert(self):
        for file in self.images:  #对当前打开的所有图片进行转换
            im = Image.open(file)
            im = im.resize((self.saveSize[0],self.saveSize[1]))#大小
            if self.imagetype.GetSelection() == 0:  #储存格式判断
                im.save(self.savedir + '\\' + os.path.basename(file),'JPEG')
            else:
                s = str(os.path.basename(file)[:-3]) #对于bmp文件,改变后缀
                s += 'bmp'
                im.save(self.savedir + '\\' + s,'BMP')
     3,相应改变分辨率的文本框:

    

def OnTextCtrlWidthText(self, event):  #Text change 事件
        try:
            pos = self.textCtrlWidth.GetInsertionPoint() #保存当前光标位置
            width = int(self.textCtrlWidth.GetValue())   #根据输入宽度计算高度
            height = int(float(width) * float(self.imagesize[1]) /#以保持横纵比 float(self.imagesize[0]))
            self.saveSize = [width,height]
            self.SetSaveSizeText()                          #更新显示
            self.textCtrlWidth.SetInsertionPoint(pos)   #还原光标位置
        except:
            event.Skip()
     最后,程序的运行结果如下,可以看到,wxwidgets的界面还是相当漂亮的(我忍不住又这样说了,呵呵):

    使用方法:
    1,点击打开文件,使用shift或直接框住需要转换的多个文件,打开.
    2,左边显示的是当前图像大小以及有多少个图片将要被转换.右边的时可以调整的长度,宽度不能调整,因为需要保持横纵比.
    3,选择最终的文件格式jpg或者bmp
    4,点击保存文件,选择一个文件夹用于保存所有转换后的图片文件.
    5,当然,也可以通过选择上一张,下一张来浏览选中的图片.

你可能感兴趣的:(基于WxPython的批量图片缩放工具)