All pastes #1903853 Raw Edit

feiosqt.py

public python v1 · immutable
#1903853 ·published 2010-07-19 18:28 UTC
rendered paste body
#!/usr/bin/python# coding=utf-8import sys, osfrom PyQt4 import QtGui, QtCoreimport shutilimport Image, ImageDrawclass CentralWidget(QtGui.QWidget):    def __init__(self, parent= None):        QtGui.QWidget.__init__(self, parent)                # spinbox para alterar o ângulo da imagem        self.graus = QtGui.QSpinBox()        self.graus.setRange(0, 359)        self.graus.setValue(0)        self.graus.setWrapping(True)        self.graus.setMaximumWidth(40)                # barra de rolagem vertical para deslocar a imagem.        self.deslocamento = QtGui.QScrollBar(QtCore.Qt.Horizontal)        self.deslocamento.setRange(-30, 30)        self.deslocamento.setValue(0)        self.deslocamento.setMaximumWidth(200)        self.desloc_label = QtGui.QLabel('0')                self.ok = QtGui.QPushButton('ok', self)        self.ok.setLayoutDirection(QtCore.Qt.RightToLeft)        self.ok.setMaximumWidth(40)        # exibe a imagem em um label        self.label = QtGui.QLabel(self)                grid = QtGui.QGridLayout()        grid.addWidget(self.label, 0, 0)        grid.addWidget(self.graus,0,2)        spacer = QtGui.QSpacerItem(20,20,QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)         grid.addItem(spacer,0,1)        grid.addWidget(self.deslocamento,1,0)        grid.addWidget(self.desloc_label, 1,2)        grid.addWidget(self.ok, 2, 2, 1, 1)         self.setLayout(grid)class MainWindow(QtGui.QMainWindow):    def __init__(self):        QtGui.QMainWindow.__init__(self)        self.resize(700, 300)        self.setWindowTitle(u'Gerador de Rostos Simétricos')        self.filename = 'vazio.png'        exit = QtGui.QAction(QtGui.QIcon('Exit.png'), 'Exit', self)        exit.setShortcut('Ctrl+Q')        exit.setStatusTip('Exit application')        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))        abre_arquivo = QtGui.QAction( 'Open File', self)        self.connect(abre_arquivo, QtCore.SIGNAL('triggered()'), self.abre_arquivo)        file = self.menuBar().addMenu('&File')        file.addAction(abre_arquivo)        file.addAction(exit)                self.cw = CentralWidget()        self.setCentralWidget(self.cw)        self.connect(self.cw.graus, QtCore.SIGNAL('valueChanged(int)'), self.atualiza_imagem)        self.connect(self.cw.deslocamento, QtCore.SIGNAL('valueChanged(int)'), self.atualiza_imagem)        self.connect(self.cw.ok, QtCore.SIGNAL('clicked()'), self.processa_imagem)        self.atualiza_imagem()    def processa_imagem(self):        ''' gera os dois rostos a partir da imagem calibrada        '''                # se já estava exibindo a imagem resultado, volta a exibir a imagem original        if self.cw.label.width() == 600:            self.atualiza_imagem()            return()                    # define nomes de arquivos temporários        fname = './temp/temp_'+ str(self.filename).split('/')[-1]        rname = './temp/result_'+ str(self.filename).split('/')[-1]                # abre imagem calibrada        im = Image.open(fname)        # gera as duas imagens a partir da original        lefthalf = im.crop((0,0,(im.size[0]/2), im.size[1]))        righthalf = im.crop(((im.size[0]/2),0,im.size[0], im.size[1]))                # gera as imagens espelho        leftflip = lefthalf.transpose(Image.FLIP_LEFT_RIGHT)        rightflip = righthalf.transpose(Image.FLIP_LEFT_RIGHT)        # cria o objeto para armazenar a imagem resultado        result = Image.new("RGBA", (im.size[0]*3,im.size[1]))        # cola a original        result.paste(im,(0,0))        # a gerada a partir do lado esquerdo        result.paste(lefthalf, (im.size[0],0))        result.paste(leftflip, ((im.size[0] + im.size[0]/2) ,0))        # a gerada a partir do lado direito        result.paste(rightflip, (im.size[0]*2,0))        result.paste(righthalf, (im.size[0]*2+im.size[0]/2,0))        result.save(rname)                # mostra a imagem resultado        pixmap = QtGui.QPixmap(rname)        pixmap = pixmap.scaled(600,200, QtCore.Qt.KeepAspectRatio)        self.cw.label.setPixmap(pixmap)    def atualiza_imagem(self, valor=0):        '''' exibe a imagem original com o deslocamento e rotação corretos.         '''                 # define nomes de arquivos temporários        fname = './temp/temp_'+ str(self.filename).split('/')[-1]        redfname = './temp/red_' + str(self.filename).split('/')[-1]                # usa a imagem original        image = Image.open(str(self.filename))                # primeiro rotaciona        if self.cw.graus.value() >0:            image = image.rotate(self.cw.graus.value())                    # desloca a imagem        delta = self.cw.deslocamento.value()        self.cw.desloc_label.setText(str(delta))                if delta !=0:                     xsize, ysize = image.size                    result = Image.new("RGBA", (image.size[0],image.size[1]))                    if delta >0:                # se positivo desloca a imagem para direita                xsize = xsize -int(xsize*delta/100.0)                part1 = image.crop((0, 0, xsize, ysize))                result.paste(part1,(image.size[0]-xsize,0,image.size[0], ysize))            else:                # se negativo, desloca a imagem paa esquerda                xsize = xsize +int(xsize*delta/100.0)                part1 = image.crop((image.size[0]-xsize,0,image.size[0], ysize))                result.paste(part1,(0,0,xsize,ysize))                            image  = result        image.save(fname)                # desenha linha vermelha central para auxiliar a calibração da imagem.        draw = ImageDraw.Draw(image)        draw.line((image.size[0]/2,0,image.size[0]/2,image.size[1]), fill='red')        image.save(redfname)                    # mostra a imagem        pixmap = QtGui.QPixmap(redfname)        pixmap = pixmap.scaled(200,200, QtCore.Qt.KeepAspectRatio)        self.cw.label.setPixmap(pixmap)            def abre_arquivo(self):        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file', './fotos')                if filename  != "":            self.filename = filename            fname = str(self.filename).split('/')[-1]            shutil.copyfile(self.filename,'./temp/temp_' + fname )            self.cw.deslocamento.setValue(0)            self.cw.graus.setValue(0)            self.atualiza_imagem()# cria diretórios e imagem auxiliar, se precisoif not os.path.exists('./temp'):    os.mkdir('./temp')    if not os.path.exists('./fotos'):    os.mkdir('./fotos')if not os.path.exists('vazio.png'):    imagem = Image.new("RGBA", (200,200))    imagem.save('vazio.png')# inicia a GUIapp = QtGui.QApplication(sys.argv)main = MainWindow()main.show()sys.exit(app.exec_())