[题目五]:为游戏做准备

1、建议在C#下使用GDI+
2、MFC或C++.Net下用起来比较麻烦,网上MFC的例子较多
3、主要的类Graphics参见MSDN:
http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1
4、参考下面的例子,进一步拓展其他功能,实现更复杂的图形编程。比如贝塞尔曲线实现烟花效果https://wow.techbrood.com/fiddle/10230

步骤一:
如图,在From上放3个按钮




import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import QtGui,QtCore
import cv2
import pyprind
import numpy as np
from PIL import Image, ImageFont
import timedef rgb2Char(r, g, b, alpha=256):"""颜色转字符:param r: 颜色的选择:param g: 颜色的选择:param b: 颜色的选择:param alpha: 透明度:return:"""CHARS = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "if alpha == 0:return ''gray = int(0.2126*r + 0.7152*g + 0.0722*b)return CHARS[gray % len(CHARS)]def video2charVideo(videofile):""":param videofile: 给出视频的地址:return: 返回为视频转换后字符串的矩阵"""CHARS = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "videoChar=[]cap = cv2.VideoCapture(videofile)font = ImageFont.load_default().fontfont_w, font_h = font.getsize(CHARS[1])font_h += 2for i in pyprind.prog_bar(range(int(cap.get(7)))):frame = cap.read()[1]frame = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))frame = frame.resize((font_w*frame.width//font_w, font_h*frame.height//font_h), Image.NEAREST)width_ori = frame.widthheight_ori = frame.heightframe = frame.resize((width_ori//font_w, height_ori//font_h), Image.NEAREST)width = frame.widthheight = frame.heightprint(height,width)_frame = []for i in range(height):row = []for j in range(width):pixel = frame.getpixel((j, i))row.append(rgb2Char(*pixel))_frame.append(row)videoChar.append(_frame)cap.release()videoChar=np.array(videoChar)# np.save("video.npy",arr=videoChar)return Trueclass StockDialog(QWidget):def __init__(self, parent=None):super(StockDialog, self).__init__(parent)self.setWindowTitle("Form1")mainSplitter = QSplitter(Qt.Horizontal)mainSplitter.setOpaqueResize(True)frame = QFrame(mainSplitter)mainLayout = QGridLayout(frame)# mainLayout.setMargin(10)mainLayout.setSpacing(6)label1 = QLabel("形状:")label2 = QLabel("画笔线宽:")label3 = QLabel("画笔颜色:")label4 = QLabel("画笔风格:")label5 = QLabel("画笔顶端:")label6 = QLabel("画笔连接点:")label7 = QLabel("画刷风格:")label8 = QLabel("画刷颜色:")self.shapeComboBox = QComboBox()self.shapeComboBox.addItem("Line", "Line")self.shapeComboBox.addItem("Rectangle", "Rectangle")self.shapeComboBox.addItem('Rounded Rectangle', 'Rounded Rectangle')self.shapeComboBox.addItem('Ellipse', 'Ellipse')self.shapeComboBox.addItem('Pie', 'Pie')self.shapeComboBox.addItem('Chord', 'Chord')self.shapeComboBox.addItem('Path', 'Path')self.shapeComboBox.addItem('Polygon', 'Polygon')self.shapeComboBox.addItem('Polyline', 'Polyline')self.shapeComboBox.addItem('Arc', 'Arc')self.shapeComboBox.addItem('Points', 'Points')self.shapeComboBox.addItem('Text', 'Text')self.shapeComboBox.addItem('Pixmap', 'Pixmap')self.widthSpinBox = QSpinBox()self.widthSpinBox.setRange(0, 20)self.penColorFrame = QFrame()self.penColorFrame.setAutoFillBackground(True)self.penColorFrame.setPalette(QPalette(Qt.blue))self.penColorPushButton = QPushButton("更改")self.clearPushButton=QPushButton("清除")self.startMV=QPushButton("播放动画")self.mvSelect=QComboBox()self.mvSelect.addItem("及你太美")self.mvSelect.addItem("粒子碰撞")self.penStyleComboBox = QComboBox()self.penStyleComboBox.addItem("Solid", Qt.SolidLine)self.penStyleComboBox.addItem('Dash', Qt.DashLine)self.penStyleComboBox.addItem('Dot', Qt.DotLine)self.penStyleComboBox.addItem('Dash Dot', Qt.DashDotLine)self.penStyleComboBox.addItem('Dash Dot Dot', Qt.DashDotDotLine)self.penStyleComboBox.addItem('None', Qt.NoPen)self.penCapComboBox = QComboBox()self.penCapComboBox.addItem("Flat", Qt.FlatCap)self.penCapComboBox.addItem('Square', Qt.SquareCap)self.penCapComboBox.addItem('Round', Qt.RoundCap)self.penJoinComboBox = QComboBox()self.penJoinComboBox.addItem("Miter", Qt.MiterJoin)self.penJoinComboBox.addItem('Bebel', Qt.BevelJoin)self.penJoinComboBox.addItem('Round', Qt.RoundJoin)self.brushStyleComboBox = QComboBox()self.brushStyleComboBox.addItem("Linear Gradient", Qt.LinearGradientPattern)self.brushStyleComboBox.addItem('Radial Gradient', Qt.RadialGradientPattern)self.brushStyleComboBox.addItem('Conical Gradient', Qt.ConicalGradientPattern)self.brushStyleComboBox.addItem('Texture', Qt.TexturePattern)self.brushStyleComboBox.addItem('Solid', Qt.SolidPattern)self.brushStyleComboBox.addItem('Horizontal', Qt.HorPattern)self.brushStyleComboBox.addItem('Vertical', Qt.VerPattern)self.brushStyleComboBox.addItem('Cross', Qt.CrossPattern)self.brushStyleComboBox.addItem('Backward Diagonal', Qt.BDiagPattern)self.brushStyleComboBox.addItem('Forward Diagonal', Qt.FDiagPattern)self.brushStyleComboBox.addItem('Diagonal Cross', Qt.DiagCrossPattern)self.brushStyleComboBox.addItem('Dense 1', Qt.Dense1Pattern)self.brushStyleComboBox.addItem('Dense 2', Qt.Dense2Pattern)self.brushStyleComboBox.addItem('Dense 3', Qt.Dense3Pattern)self.brushStyleComboBox.addItem('Dense 4', Qt.Dense4Pattern)self.brushStyleComboBox.addItem('Dense 5', Qt.Dense5Pattern)self.brushStyleComboBox.addItem('Dense 6', Qt.Dense6Pattern)self.brushStyleComboBox.addItem('Dense 7', Qt.Dense7Pattern)self.brushStyleComboBox.addItem('None', Qt.NoBrush)self.brushColorFrame = QFrame()self.brushColorFrame.setAutoFillBackground(True)self.brushColorFrame.setPalette(QPalette(Qt.green))self.brushColorPushButton = QPushButton("更改")labelCol = 0contentCol = 1# 建立布局mainLayout.addWidget(label1, 1, labelCol)mainLayout.addWidget(self.shapeComboBox, 1, contentCol)mainLayout.addWidget(label2, 2, labelCol)mainLayout.addWidget(self.widthSpinBox, 2, contentCol)mainLayout.addWidget(label3, 4, labelCol)mainLayout.addWidget(self.penColorFrame, 4, contentCol)mainLayout.addWidget(self.penColorPushButton, 4, 2)mainLayout.addWidget(self.clearPushButton, 15, 0)mainLayout.addWidget(self.mvSelect,15,1)mainLayout.addWidget(self.startMV,15,2)mainLayout.addWidget(label4, 6, labelCol)mainLayout.addWidget(self.penStyleComboBox, 6, contentCol)mainLayout.addWidget(label5, 8, labelCol)mainLayout.addWidget(self.penCapComboBox, 8, contentCol)mainLayout.addWidget(label6, 10, labelCol)mainLayout.addWidget(self.penJoinComboBox, 10, contentCol)mainLayout.addWidget(label7, 12, labelCol)mainLayout.addWidget(self.brushStyleComboBox, 12, contentCol)mainLayout.addWidget(label8, 14, labelCol)mainLayout.addWidget(self.brushColorFrame, 14, contentCol)mainLayout.addWidget(self.brushColorPushButton, 14, 2)mainSplitter1 = QSplitter(Qt.Horizontal)mainSplitter1.setOpaqueResize(True)stack1 = QStackedWidget()stack1.setFrameStyle(QFrame.Panel | QFrame.Raised)self.area = PaintArea()stack1.addWidget(self.area)frame1 = QFrame(mainSplitter1)mainLayout1 = QVBoxLayout(frame1)# mainLayout1.setMargin(10)mainLayout1.setSpacing(6)mainLayout1.addWidget(stack1)layout = QGridLayout(self)layout.addWidget(mainSplitter1, 0, 0)layout.addWidget(mainSplitter, 0, 1)self.setLayout(layout)self.connecter()self.slotShape(self.shapeComboBox.currentIndex())self.slotPenWidth(self.widthSpinBox.value())self.slotBrush(self.brushStyleComboBox.currentIndex())def _clearPushButton(self):self.area.pos_xy=[]self.update()def connecter(self):# 信号和槽函数self.shapeComboBox.activated.connect(self.slotShape)self.widthSpinBox.valueChanged.connect(self.slotPenWidth)self.penColorPushButton.clicked.connect(self.slotPenColor)self.clearPushButton.clicked.connect(self._clearPushButton)self.penStyleComboBox.activated.connect(self.slotPenStyle)self.penCapComboBox.activated.connect(self.slotPenCap)self.penJoinComboBox.activated.connect(self.slotPenJoin)self.brushStyleComboBox.activated.connect(self.slotBrush)self.brushColorPushButton.clicked.connect(self.slotBrushColor)self.startMV.clicked.connect(self._startMV)def myupdate(self):timer = QtCore.QTimer(self)timer.start(50)timer.timeout.connect(self.update)def _startMV(self):"""开始播放动画分为两个动画一个是字符串动画:及你太美一个是小球碰撞分别转入对应的函数实现"""id=self.mvSelect.currentIndex()self.startMV.setText("停止播放")self.area.signal=not self.area.signalif id==0 and self.area.signal:videoChar=np.load(file="video.npy")self._jntm(videoChar)elif id==1 and self.area.signal:self._yh()def _jntm(self,video):"""及你太美:param video: 输入numpy格式的矩阵即可在作图区域更新视图调用drawText函数在对应区域画字符每次画完一帧则更新视图即pen.end()"""t,h,w=np.shape(video)for i in range(t):if not self.area.signal:breakp = QPainter(self)p.setPen(self.area.pen)p.setBrush(self.area.brush)self.area.str=video[i]self.area.shape="_jntm"self.area.repaint()self.connecter()def _yh(self):"""小球碰撞动画其中随机初始化初始坐标和初始速度T为小球数量delta为刷新时间间隔每次画完一组小球后更新视图"""T=100startxy=np.random.randint(30,200,size=(T,2)).transpose()startv=np.random.randint(2,20,size=(T,2)).transpose()deltaT=0.5while self.area.signal:self.area._yhxy =startxyself.area.shape="_yh"self.area.repaint()startxy=startxy+(deltaT*startv).astype(np.int)startv[1][:]=startv[1][:]*pow(-1,(startxy[1][:]%400<=20))startv[0][:]=startv[0][:]*pow(-1,(startxy[0][:]%1200<=20))self.connecter()time.sleep(0.05)def slotShape(self, value):"""传递参数给控件,同时调用其函数画图:param value: value为目标图形的index"""shape = self.area.Shape[value]self.area.setShape(shape)def slotPenWidth(self, value):""":param value: 设置作图笔的基本属性"""color = self.penColorFrame.palette().color(QPalette.Window)style = Qt.PenStyle(self.penStyleComboBox.itemData(self.penStyleComboBox.currentIndex(), Qt.UserRole))cap = Qt.PenCapStyle(self.penCapComboBox.itemData(self.penCapComboBox.currentIndex(), Qt.UserRole))join = Qt.PenJoinStyle(self.penJoinComboBox.itemData(self.penJoinComboBox.currentIndex(), Qt.UserRole))self.area.setPen(QPen(color, value, style, cap, join))def slotPenStyle(self, value):self.slotPenWidth(value)def slotPenCap(self, value):self.slotPenWidth(value)def slotPenJoin(self, value):self.slotPenWidth(value)def slotPenColor(self):color = QColorDialog.getColor(Qt.blue)self.penColorFrame.setPalette(QPalette(color))self.area.setPen(QPen(color))def slotBrushColor(self):color = QColorDialog.getColor(Qt.blue)self.brushColorFrame.setPalette(QPalette(color))self.slotBrush(self.brushStyleComboBox.currentIndex())def slotBrush(self, value):"""设置brush的基本属性对于封闭图形才会有效:param value:"""color = self.brushColorFrame.palette().color(QPalette.Window)style = Qt.BrushStyle(self.brushStyleComboBox.itemData(value, Qt.UserRole))if (style == Qt.LinearGradientPattern):linearGradient = QLinearGradient(0, 0, 400, 400)linearGradient.setColorAt(0.0, Qt.white)linearGradient.setColorAt(0.2, color)linearGradient.setColorAt(1.0, Qt.black)self.area.setBrush(linearGradient)elif style == Qt.RadialGradientPattern:radialGradient = QRadialGradient(200, 200, 80, 70, 70);radialGradient.setColorAt(0.0, Qt.white)radialGradient.setColorAt(0.2, Qt.green)radialGradient.setColorAt(1.0, Qt.black)self.area.setBrush(radialGradient)elif (style == Qt.ConicalGradientPattern):conicalGradient = QConicalGradient(200, 200, 30)conicalGradient.setColorAt(0.0, Qt.white)conicalGradient.setColorAt(0.2, color)conicalGradient.setColorAt(1.0, Qt.black)self.area.setBrush(conicalGradient)elif (style == Qt.TexturePattern):self.area.setBrush(QBrush(QPixmap("images/brick.png")))else:self.area.setBrush(QBrush(color, style))class PaintArea(QWidget):def __init__(self):super(PaintArea, self).__init__()self.Shape = ["Line", "Rectangle", 'Rounded Rectangle', "Ellipse", "Pie", 'Chord',"Path", "Polygon", "Polyline", "Arc", "Points", "Text", "Pixmap"]self.setPalette(QPalette(Qt.white))self.setAutoFillBackground(True)self.setMinimumSize(1200, 400)self.pen = QPen()self.setMouseTracking(False)self.pos_xy = []self.brush = QBrush()self.str=Noneself._yhxy=Noneself.signal=Falsedef setShape(self, s):self.shape = sself.update()def clear(self):self.shape = "clear"self.update()def setPen(self, p):self.pen = pself.update()def setBrush(self, b):self.brush = bself.update()def paintEvent(self, QPaintEvent):""":param QPaintEvent: 画图事件,repaint()可以调用包括一些画图事件触发是根据参数进行调用出发不同的功能"""p = QPainter(self)p.setPen(self.pen)p.setBrush(self.brush)rect = QRect(50, 100, 300, 200)points = [QPoint(150, 100), QPoint(300, 150), QPoint(350, 250), QPoint(100, 300)]startAngle = 30 * 16spanAngle = 120 * 16path = QPainterPath()path.addRect(150, 150, 100, 100)path.moveTo(100, 100)path.cubicTo(300, 100, 200, 200, 300, 300)path.cubicTo(100, 300, 200, 200, 100, 100)if self.shape == "Line":p.drawLine(rect.topLeft(), rect.bottomRight())elif self.shape == "Rectangle":p.drawRect(rect)elif self.shape == 'Rounded Rectangle':p.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)elif self.shape == "Ellipse":p.drawEllipse(rect)elif self.shape == "Polygon":p.drawPolygon(QPolygon(points), Qt.WindingFill)elif self.shape == "Polyline":p.drawPolyline(QPolygon(points))elif self.shape == "Points":p.drawPoints(QPolygon(points))elif self.shape == "Pie":p.drawPie(rect, startAngle, spanAngle)elif self.shape == "Arc":p.drawArc(rect, startAngle, spanAngle)elif self.shape == "Chord":p.drawChord(rect, startAngle, spanAngle)elif self.shape == "Path":p.drawPath(path)elif self.shape == "Text":self.drawChar(30,30,"@@@",p)# p.drawText(rect, Qt.AlignCenter, "Hello Qt!")elif self.shape == "Pixmap":p.drawPixmap(150, 150, QPixmap("images/qt-logo.png"))elif self.shape == "clear":p.drawPixmap(150, 150, QPixmap("images/qt-logo.png"))elif self.shape=="_jntm":h,w=np.shape(self.str)p.setFont(QFont('Times New Roman', 4))for i in range(h):for j in range(w):p.drawText(4*j+5,4*i+5,self.str[i][j])elif self.shape=="_yh":for item in self._yhxy.transpose():p.drawEllipse(QRect(item[0],item[1],10,10))p.end()if len(self.pos_xy) > 1 and self.shape!="clear":point_start = self.pos_xy[0]for pos_tmp in self.pos_xy:point_end = pos_tmpif point_end == (-1, -1):point_start = (-1, -1)continueif point_start == (-1, -1):point_start = point_endcontinuep.drawLine(point_start[0], point_start[1], point_end[0], point_end[1])self.update()point_start = point_endp.end()def mouseMoveEvent(self, event):"""鼠标拖动时自动记录其轨迹,并画出来:param event:"""pos_tmp = (event.pos().x(), event.pos().y())self.pos_xy.append(pos_tmp)self.update()def mouseReleaseEvent(self, event):""":param event:每次鼠标释放时自动调用,可以打一个断点"""pos_test = (-1, -1)self.pos_xy.append(pos_test)self.update()if __name__ == '__main__':app = QApplication(sys.argv)form = StockDialog()form.show()app.exec_()

python+字符动画+粒子碰撞动画+手写画板相关推荐

  1. BP神经网络实现手写数字识别Python实现,带GUI手写画板

    BP神经网络实现手写数字识别 BP神经网络模型 用tkinter编写用于手写输入的画板 程序运行的效果截图 在B站看了一个机器学习基础的视频( 链接)后,发现到资料里面有一个用BP神经网络对手写数字进 ...

  2. Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)

    Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM) dsize = 20 affine_flags = lmc_cv.WARP ...

  3. Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)

    Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN) OCR of Hand-written Digits ########## ...

  4. flutter手写画板,保存存成图片并上传到后台服务器

    1.只是一个dome,供借鉴使用,待优化 图例: 2. 这个手写画板借鉴了很多的github上面的内容,基本就是用github上的内容拼凑出来的,随后我会把github上相关的链接写上去 3. 全部代 ...

  5. 基于摄像头实现手写输入字符功能(视频手写)

    当前市场上的PC摄像头,尽管生产厂家在外观上费尽心思,以求获得顾客亲睐,但中国的摄像头生产厂商太多,产品外观大同小异,同化现象严重,任何一个厂家已经不能仅凭精美的外观设计手段去提高市场份额了.PC摄像 ...

  6. 人工智能入门第一课:手写字体识别及可视化项目(手写画板)(mnist)

    人工智能入门第一课:手写字体识别及可视化项目(手写画板)(mnist),使用技术(Django+js+tensorflow+html+bootstrap+inspinia框架) 直接上图,项目效果 1 ...

  7. 基于Python的BP网络实现手写数字识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790047 资源下载地址:https://download.csdn.net/downl ...

  8. html5 canvas手写画板 下载图片至本地

    html5 canvas手写画板 下载图片至本地 <!DOCTYPE html> <html><head><meta charset="utf-8& ...

  9. 手写画板实现并转化成图片

    手写画板实现并转化成图片 <!DOCTYPE html> <html> <head> <title>画板实验</title><meta ...

  10. Python基于深度学习的手写数字识别

    Python基于深度学习的手写数字识别 1.代码的功能和运行方法 2. 网络设计 3.训练方法 4.实验结果分析 5.结论 1.代码的功能和运行方法 代码可以实现任意数字0-9的识别,只需要将图片载入 ...

最新文章

  1. PyTorch 笔记(05)— Tensor 基本运算(torch.abs、torch.add、torch.clamp、torch.div、torch.mul、torch.pow等)
  2. linux shell数据重定向(输入重定向与输出重定向)详细分析
  3. pandas 分组统计的三个函数 pivot table crosstab groupby
  4. 《Javascript语言精粹》 读书笔记
  5. Kohana和Zencart
  6. oracle导出审计表,Oracle审计表AUD$处理方法
  7. xheditor富文本框 存值与展示问题
  8. php 创建文本文件,php-创建文本文件以进行实时下载
  9. HTML emoji
  10. python操作cad的模块_怎么把freecad当python模块来用
  11. 致敬mentohust,路由器使用Socket认证华科校园网
  12. 华为大数据与阿里大数据的区别
  13. 编程修养-C语言篇(二)
  14. Python 05 包Packet
  15. requests使用splash
  16. 【图像增强】基于萤火虫算法实现图像对比度增强附matlab代码
  17. 今年上半年,通信行业发生了哪些事?
  18. dio设置自定义post请求_flutter Dio封装get/post请求
  19. 微信小程序图文混合动态显示
  20. 科普小知识之生活中的传热学

热门文章

  1. Electron前端开发桌面程序--入门篇
  2. ASP运行环境的搭建
  3. mysql TMM_mysql使用命令导出导入数据(数据备份、恢复)
  4. 【mac】mac设置鼠标习惯
  5. 微信客服图片自动回复功能
  6. 【论文简述】Efficient Multi-view Stereo by Iterative Dynamic Cost Volume(CVPR 2022)
  7. Adobe Lightroom Classic 入门教程(八)本地局部调整 --- 渐变滤镜与径向滤镜
  8. Microsoft Edge很好用的浏览器
  9. 在 Excel 中使用 C# .NET 用户定义函数 (UDF)
  10. 最好的PDF转换器绿色下载