import cython from libc cimport math as cmath from libc.string cimport memcpy as c_memcpy from libc.string cimport memset as c_memset from libc.stdlib cimport malloc, free import numpy as np ################################################################################################################# def createImgSlow(img,imageHeight,imageWidth,phasePixel,orientation): cdef unsigned char [:, :] img_view = img cdef int u = 0 cdef int v = 0 cdef unsigned char val; for u in range(imageWidth): for v in range(imageHeight): val= (127*(1+cmath.sin(((u+phasePixel)/10.)))) img_view[v][u] = val ################################################################################################################# def createImgFast(img,int imageHeight,int imageWidth,float frequencyPixel,float phasePixel,int orientation,int drawSquare): cdef unsigned char [:, :] img_view = img cdef int u = 0 cdef int v = 0 cdef unsigned char *singleLine cdef unsigned int squaresize=20 #generate one line of sinusoidal signal cdef int maxdim=imageWidth if maxdimmalloc(maxdim) for u in range(maxdim): singleLine[u] = (127*(1+cmath.sin(((u+phasePixel)*2*cmath.pi*frequencyPixel/imageWidth)))) #vertical lines if orientation==0: for v in range(0,imageHeight,1): c_memcpy(&(img_view[v][0]),&(singleLine[0]),imageWidth) #horizontal lines else: if orientation==1: for v in range(0,imageHeight,1): c_memset(&(img_view[v][0]),singleLine[v],imageWidth) #may be draw a black or white square in the corner if drawSquare!=0: for v in range(imageHeight-squaresize,imageHeight,1): c_memset(&(img_view[v][imageWidth-squaresize]),(drawSquare-1)*255,squaresize) free(singleLine) ################################################################################################################# def testsinus(): imageWidth=1920 imageHeight=1080 # Memoryview on a NumPy array img = np.empty((imageHeight,imageWidth), dtype=np.dtype("uint8")) # help (np.empty) print("-------------------------------------------------------") createImgSlow(img,imageHeight,imageWidth,0,0) createImgFast(img,imageHeight,imageWidth,1,0,0,1) print("-------------------------------------------------------") ################################################################################################################# #!/usr/bin/python3 # -*- coding: utf-8 -* #Bertrand Vandeportaele 2017 #can use python2 or python3 #can use QT4 or QT5, qtVersionMajor is et accordingly to 4 or 5 fullScreen=False #default size for windowed application imageWidth=1920 imageHeight=1080 import os import sys #compile the library to .so with the corresponding version of python if sys.version_info < (3, 0): os.system('python2 setup.py build_ext --inplace') else: os.system('python3 setup.py build_ext --inplace') import time import sinus import math import sip #https://pythonspot.com/qt4-pixmaps-images/ #import desired Qt library version #https://stackoverflow.com/questions/1051254/check-if-python-package-is-installed from imp import find_module def checkPythonmod(mod): try: op = find_module(mod) return True except ImportError: return False if checkPythonmod('PyQt5'): from PyQt5.QtGui import * from PyQt5 import * from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * qtVersionMajor=5 print('QT5 is used') else: if checkPythonmod('PyQt4'): from PyQt4.QtGui import * from PyQt4 import * qtVersionMajor=4 print('QT4 is used') else: print('Only QT4 and QT5 are supported. Quitting') exit(-1) from PIL import Image import numpy ###############################" COLORTABLE=[] for i in range(256): COLORTABLE.append(QtGui.qRgb(i,i,i)) ###############################" def update(): global label global imageWidth global imageHeight global img update.cpt=(update.cpt+1) #%255; t = time.time() #sinus.createImgSlow(img,imageHeight,imageWidth,update.cpt) sinus.createImgFast(img,imageHeight,imageWidth,(update.cpt//40),(update.cpt%40)*2.*math.pi/40.,(update.cpt/20)%2,(update.cpt%2)+1) #sinus.createImgFast(img,imageHeight,imageWidth,10,update.cpt,0,(update.cpt%2)+1) #sinus.createImgFast(img,imageHeight,imageWidth,(update.cpt//40),(update.cpt%40)*imageWidth/(update.cpt/40),(update.cpt/20)%2,(update.cpt%2)+1) elapsed = time.time() - t print(str(elapsed)) QI=QtGui.QImage(img.data, imageWidth, imageHeight, QtGui.QImage.Format_Indexed8) QI.setColorTable(COLORTABLE) label.setPixmap(QtGui.QPixmap.fromImage(QI)) if fullScreen==True: #always reset this windows as the active one.... only for linux command='wmctrl -a \''+windowsName+'\'' os.system(command) ###############################" #equivalent to the initialization of a static variable update.cpt=40 # Create window #app = QApplication(sys.argv) if qtVersionMajor==4: app = QtGui.QApplication(sys.argv) if fullScreen==True: w = QWidget(None,QtCore.Qt.FramelessWindowHint) else: w = QWidget(None) windowsName="PyQT4 Sinus" else: if qtVersionMajor==5: app = QtWidgets.QApplication(sys.argv) if fullScreen==True: w = QtWidgets.QWidget(None,QtCore.Qt.FramelessWindowHint) else: w = QtWidgets.QWidget(None) windowsName="PyQT5 Sinus" if fullScreen==True: V = app.desktop().screenGeometry() screenHeight = V.height() screenWidth = V.width() print("The screen resolution (width X height) is the following:") print(str(screenWidth) + "X" + str(screenHeight)) imageWidth=screenWidth imageHeight=screenHeight #for fullscreen: https://stackoverflow.com/questions/1732935/pyqt-display-fullscreen-image w.setWindowTitle(windowsName) # Create widget label = QLabel(w) # Memoryview on a NumPy array, # help (numpy.empty) img = numpy.empty((imageHeight,imageWidth), dtype=numpy.dtype("uint8")) update() IM = QtGui.QImage(imageWidth, imageHeight, QtGui.QImage.Format_Indexed8) label.setGeometry(QtCore.QRect(0,0,imageWidth,imageHeight)) #timer adpated from example 1 of https://www.programcreek.com/python/example/52106/PyQt4.QtCore.QTimer timer = QtCore.QTimer() if qtVersionMajor==4: app.connect(timer, QtCore.SIGNAL('timeout()'), update) else: if qtVersionMajor==5: timer.timeout.connect(update) timer.start(1 * 10) # 1 seconds # Draw window w.show() if fullScreen==True: w.showFullScreen() #set the focus to this windows so ALT+F4 close it.. no it is the qt focus only... w.setFocus() sys.exit(app.exec_()) ​ from distutils.core import setup from Cython.Build import cythonize setup( name = 'sinus lib', ext_modules = cythonize("​sinus.pyx"​),​ ) =====Installation===== sudo apt-get install build-essential python3-dev libqt4-dev sudo apt-get install python3-pyqt4 sudo apt-get install python3-numpy python3-pip pip3 install --upgrade pip pip3 install Cython sudo apt-get install cython pip3 install sip Pour compiler la librairie sinus: python3 setup.py build_ext --inplace Pour analyser le code C généré et détecter les surcouts liés à python (en jaune) cython -3 -a sinus.pyx firefox sinus.html