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

来源:互联网 发布:js替换p标签里的值 编辑:程序博客网 时间:2024/06/02 00:44

    (说明: 这是我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,当然,也可以通过选择上一张,下一张来浏览选中的图片.

原创粉丝点击