(说明: 这是我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的界面还是相当漂亮的(我忍不住又这样说了,呵呵):