From 6cd4c94cf5a227d90ab065552eac1316f5e7aeff Mon Sep 17 00:00:00 2001 From: Irony <892768447@qq.com> Date: Tue, 25 Dec 2018 21:44:39 +0800 Subject: [PATCH] QLabel --- {图片/images => QLabel/Data}/bg.png | Bin {图片/images => QLabel/Data}/bg1.jpg | Bin {图片/images => QLabel/Data}/fg.png | Bin {图片/images => QLabel/Data}/fg1.png | Bin .../图片加载/images => QLabel/Data}/head.jpg | Bin .../图片加载/images => QLabel/Data}/head.xpm | 0 .../图片加载/images => QLabel/Data}/loading.gif | Bin {图片/图片加载 => QLabel/Data}/res.qrc | 0 {图片/图片加载 => QLabel/Data}/res.rcc | Bin {图片/图片加载 => QLabel/Data}/res2.qrc | 0 .../Data}/skin_aio_friend_bubble_pressed.9.png | Bin 图片/图片旋转.py => QLabel/ImageRotate.py | 2 +- .../ImageSlipped.py | 4 +- .../testNinePatch.py => QLabel/NinePatch.py | 6 +- .../sip/testQtNinePatch.py => QLabel/QtNinePatch.py | 7 +- .../testQtNinePatch.py => QLabel/QtNinePatch2.py | 10 +- QLabel/README.md | 96 ++++ .../ScreenShot/ImageRotate.gif | Bin .../ScreenShot/ImageSlipped.gif | Bin .../ScreenShot/ImageSlipped2.gif | Bin .../ScreenShot/NinePatchImage.gif | Bin .../图片加载.gif => QLabel/ScreenShot/ShowImage.gif | Bin .../图片加载/图片加载.py => QLabel/ShowImage.py | 144 +++--- .../tools => QLabel/Tools}/Image2XPM.exe | Bin {图片/图片加载/tools => QLabel/Tools}/rcc.exe | Bin 列表/README.md | 35 -- 图片/README.md | 36 -- 图片/图片加载/README.md | 25 - 图片/图片加载/res_rc.py | 471 ------------------ 图片/图片加载/xpmres.py | 399 --------------- 图片/显示.9格式图片/README.md | 51 -- .../pyd版本/QtNinePatch/QtNinePatch.cpp | 136 ----- .../pyd版本/QtNinePatch/QtNinePatch.h | 26 - .../pyd版本/QtNinePatch/QtNinePatch.pro | 38 -- .../pyd版本/QtNinePatch/QtNinePatch.pro.user | 202 -------- .../pyd版本/QtNinePatch/sip/QtNinePatch.dll | Bin 12800 -> 0 bytes .../pyd版本/QtNinePatch/sip/QtNinePatch.pyd | Bin 10752 -> 0 bytes .../pyd版本/QtNinePatch/sip/QtNinePatch.sip | 14 - .../pyd版本/QtNinePatch/sip/configure.py | 87 ---- .../显示.9格式图片/纯python版本1/NinePatch.py | 361 -------------- .../skin_aio_friend_bubble_pressed.9.png | Bin 6566 -> 0 bytes .../显示.9格式图片/纯python版本2/QtNinePatch.py | 140 ------ .../skin_aio_friend_bubble_pressed.9.png | Bin 6566 -> 0 bytes 43 files changed, 184 insertions(+), 2106 deletions(-) rename {图片/images => QLabel/Data}/bg.png (100%) rename {图片/images => QLabel/Data}/bg1.jpg (100%) rename {图片/images => QLabel/Data}/fg.png (100%) rename {图片/images => QLabel/Data}/fg1.png (100%) rename {图片/图片加载/images => QLabel/Data}/head.jpg (100%) rename {图片/图片加载/images => QLabel/Data}/head.xpm (100%) rename {图片/图片加载/images => QLabel/Data}/loading.gif (100%) rename {图片/图片加载 => QLabel/Data}/res.qrc (100%) rename {图片/图片加载 => QLabel/Data}/res.rcc (100%) rename {图片/图片加载 => QLabel/Data}/res2.qrc (100%) rename {图片/显示.9格式图片/pyd版本/QtNinePatch/sip => QLabel/Data}/skin_aio_friend_bubble_pressed.9.png (100%) rename 图片/图片旋转.py => QLabel/ImageRotate.py (98%) rename 图片/仿网页图片错位特效.py => QLabel/ImageSlipped.py (96%) rename 图片/显示.9格式图片/纯python版本1/testNinePatch.py => QLabel/NinePatch.py (89%) rename 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/testQtNinePatch.py => QLabel/QtNinePatch.py (85%) rename 图片/显示.9格式图片/纯python版本2/testQtNinePatch.py => QLabel/QtNinePatch2.py (80%) rename 图片/ScreenShot/图片旋转.gif => QLabel/ScreenShot/ImageRotate.gif (100%) rename 图片/ScreenShot/仿网页图片错位特效.gif => QLabel/ScreenShot/ImageSlipped.gif (100%) rename 图片/ScreenShot/仿网页图片错位特效2.gif => QLabel/ScreenShot/ImageSlipped2.gif (100%) rename 图片/显示.9格式图片/ScreenShot/显示.9格式图片.gif => QLabel/ScreenShot/NinePatchImage.gif (100%) rename 图片/图片加载/ScreenShot/图片加载.gif => QLabel/ScreenShot/ShowImage.gif (100%) rename 图片/图片加载/图片加载.py => QLabel/ShowImage.py (85%) rename {图片/图片加载/tools => QLabel/Tools}/Image2XPM.exe (100%) rename {图片/图片加载/tools => QLabel/Tools}/rcc.exe (100%) delete mode 100644 列表/README.md delete mode 100644 图片/README.md delete mode 100644 图片/图片加载/README.md delete mode 100644 图片/图片加载/res_rc.py delete mode 100644 图片/图片加载/xpmres.py delete mode 100644 图片/显示.9格式图片/README.md delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.cpp delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.h delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro.user delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.dll delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.pyd delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.sip delete mode 100644 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/configure.py delete mode 100644 图片/显示.9格式图片/纯python版本1/NinePatch.py delete mode 100644 图片/显示.9格式图片/纯python版本1/skin_aio_friend_bubble_pressed.9.png delete mode 100644 图片/显示.9格式图片/纯python版本2/QtNinePatch.py delete mode 100644 图片/显示.9格式图片/纯python版本2/skin_aio_friend_bubble_pressed.9.png diff --git a/图片/images/bg.png b/QLabel/Data/bg.png similarity index 100% rename from 图片/images/bg.png rename to QLabel/Data/bg.png diff --git a/图片/images/bg1.jpg b/QLabel/Data/bg1.jpg similarity index 100% rename from 图片/images/bg1.jpg rename to QLabel/Data/bg1.jpg diff --git a/图片/images/fg.png b/QLabel/Data/fg.png similarity index 100% rename from 图片/images/fg.png rename to QLabel/Data/fg.png diff --git a/图片/images/fg1.png b/QLabel/Data/fg1.png similarity index 100% rename from 图片/images/fg1.png rename to QLabel/Data/fg1.png diff --git a/图片/图片加载/images/head.jpg b/QLabel/Data/head.jpg similarity index 100% rename from 图片/图片加载/images/head.jpg rename to QLabel/Data/head.jpg diff --git a/图片/图片加载/images/head.xpm b/QLabel/Data/head.xpm similarity index 100% rename from 图片/图片加载/images/head.xpm rename to QLabel/Data/head.xpm diff --git a/图片/图片加载/images/loading.gif b/QLabel/Data/loading.gif similarity index 100% rename from 图片/图片加载/images/loading.gif rename to QLabel/Data/loading.gif diff --git a/图片/图片加载/res.qrc b/QLabel/Data/res.qrc similarity index 100% rename from 图片/图片加载/res.qrc rename to QLabel/Data/res.qrc diff --git a/图片/图片加载/res.rcc b/QLabel/Data/res.rcc similarity index 100% rename from 图片/图片加载/res.rcc rename to QLabel/Data/res.rcc diff --git a/图片/图片加载/res2.qrc b/QLabel/Data/res2.qrc similarity index 100% rename from 图片/图片加载/res2.qrc rename to QLabel/Data/res2.qrc diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/skin_aio_friend_bubble_pressed.9.png b/QLabel/Data/skin_aio_friend_bubble_pressed.9.png similarity index 100% rename from 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/skin_aio_friend_bubble_pressed.9.png rename to QLabel/Data/skin_aio_friend_bubble_pressed.9.png diff --git a/图片/图片旋转.py b/QLabel/ImageRotate.py similarity index 98% rename from 图片/图片旋转.py rename to QLabel/ImageRotate.py index f601ac0..5a650bf 100644 --- a/图片/图片旋转.py +++ b/QLabel/ImageRotate.py @@ -44,7 +44,7 @@ class Window(QWidget): 40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)) # 原始图片 - self.srcImage = QImage('images/fg.png') + self.srcImage = QImage('Data/fg.png') self.imageLabel.setPixmap(QPixmap.fromImage(self.srcImage)) def doHorFilp(self): diff --git a/图片/仿网页图片错位特效.py b/QLabel/ImageSlipped.py similarity index 96% rename from 图片/仿网页图片错位特效.py rename to QLabel/ImageSlipped.py index 062490c..018d934 100644 --- a/图片/仿网页图片错位特效.py +++ b/QLabel/ImageSlipped.py @@ -6,7 +6,7 @@ Created on 2018年10月18日 @author: Irony @site: https://pyqt5.com https://github.com/892768447 @email: 892768447@qq.com -@file: SlippedImgWidget +@file: ImageSlipped @description: """ from PyQt5.QtGui import QPixmap, QPainter @@ -75,6 +75,6 @@ if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) - w = SlippedImgWidget('images/bg1.jpg', 'images/fg1.png') + w = SlippedImgWidget('Data/bg1.jpg', 'Data/fg1.png') w.show() sys.exit(app.exec_()) diff --git a/图片/显示.9格式图片/纯python版本1/testNinePatch.py b/QLabel/NinePatch.py similarity index 89% rename from 图片/显示.9格式图片/纯python版本1/testNinePatch.py rename to QLabel/NinePatch.py index 016f50c..7893c8c 100644 --- a/图片/显示.9格式图片/纯python版本1/testNinePatch.py +++ b/QLabel/NinePatch.py @@ -6,7 +6,7 @@ Created on 2018年10月25日 @author: Irony @site: https://pyqt5.com https://github.com/892768447 @email: 892768447@qq.com -@file: testNinePatch +@file: NinePatch @description: """ @@ -22,7 +22,7 @@ import sys from PyQt5.QtGui import QImage, QPainter from PyQt5.QtWidgets import QApplication, QLabel, QWidget -from NinePatch import NinePatch +from Lib.NinePatch import NinePatch class Label(QWidget): @@ -30,7 +30,7 @@ class Label(QWidget): def __init__(self, *args, **kwargs): super(Label, self).__init__(*args, **kwargs) #.9 格式的图片 - self.image = NinePatch('skin_aio_friend_bubble_pressed.9.png') + self.image = NinePatch('Data/skin_aio_friend_bubble_pressed.9.png') def paintEvent(self, event): super(Label, self).paintEvent(event) diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/testQtNinePatch.py b/QLabel/QtNinePatch.py similarity index 85% rename from 图片/显示.9格式图片/pyd版本/QtNinePatch/sip/testQtNinePatch.py rename to QLabel/QtNinePatch.py index 35584c5..da8df5e 100644 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/testQtNinePatch.py +++ b/QLabel/QtNinePatch.py @@ -19,10 +19,13 @@ __Version__ = "Version 1.0" import sys +from ctypes import CDLL from PyQt5.QtGui import QImage from PyQt5.QtWidgets import QApplication, QLabel -from QtNinePatch import QtNinePatch +CDLL('Lib/QtNinePatch/sip/QtNinePatch.dll') + +from Lib.QtNinePatch.sip.QtNinePatch import QtNinePatch class Label(QLabel): @@ -30,7 +33,7 @@ class Label(QLabel): def __init__(self, *args, **kwargs): super(Label, self).__init__(*args, **kwargs) #.9 格式的图片 - self.image = QImage('skin_aio_friend_bubble_pressed.9.png') + self.image = QImage('Data/skin_aio_friend_bubble_pressed.9.png') def showEvent(self, event): super(Label, self).showEvent(event) diff --git a/图片/显示.9格式图片/纯python版本2/testQtNinePatch.py b/QLabel/QtNinePatch2.py similarity index 80% rename from 图片/显示.9格式图片/纯python版本2/testQtNinePatch.py rename to QLabel/QtNinePatch2.py index 3d1622c..44f4af1 100644 --- a/图片/显示.9格式图片/纯python版本2/testQtNinePatch.py +++ b/QLabel/QtNinePatch2.py @@ -6,7 +6,7 @@ Created on 2018年10月25日 @author: Irony @site: https://pyqt5.com https://github.com/892768447 @email: 892768447@qq.com -@file: testQtNinePatch +@file: QtNinePatch2 @description: """ @@ -22,7 +22,7 @@ import sys from PyQt5.QtGui import QImage from PyQt5.QtWidgets import QApplication, QLabel -import QtNinePatch +from Lib import QtNinePatch2 class Label(QLabel): @@ -30,17 +30,17 @@ class Label(QLabel): def __init__(self, *args, **kwargs): super(Label, self).__init__(*args, **kwargs) #.9 格式的图片 - self.image = QImage('skin_aio_friend_bubble_pressed.9.png') + self.image = QImage('Data/skin_aio_friend_bubble_pressed.9.png') def showEvent(self, event): super(Label, self).showEvent(event) - pixmap = QtNinePatch.createPixmapFromNinePatchImage( + pixmap = QtNinePatch2.createPixmapFromNinePatchImage( self.image, self.width(), self.height()) self.setPixmap(pixmap) def resizeEvent(self, event): super(Label, self).resizeEvent(event) - pixmap = QtNinePatch.createPixmapFromNinePatchImage( + pixmap = QtNinePatch2.createPixmapFromNinePatchImage( self.image, self.width(), self.height()) self.setPixmap(pixmap) diff --git a/QLabel/README.md b/QLabel/README.md index e69de29..d487e6d 100644 --- a/QLabel/README.md +++ b/QLabel/README.md @@ -0,0 +1,96 @@ +# QLabel + +## 1、图片加载显示 +[运行 ShowImage.py](ShowImage.py) + +通过3种方式加载图片文件和显示gif图片 + +1. 通过`QPixmap("xxx.jpg")`加载 +2. 通过`pyrcc5`转换res.qrc为res_rc.py文件,可以直接import加载 + 1. 转换命令`pyrcc5 res.qrc -o res_rc.py` + 2. `import res_rc` + 3. 此时可以通过`QPixmap(":/images/head.jpg")`来加载 +3. 通过rcc命令转成为二进制文件res.rcc + 1. 转换命令`Tools/rcc.exe -binary res2.qrc -o res.rcc` + 2. 这里把资源前缀修改下(/myfile),见res2.qrc文件 + 3. 通过`QResource.registerResource("res.rcc")`注册 + 4. 此时可以通过`QPixmap(":/myfile/images/head.jpg")`来加载 +4. 通过xpm数组加载 + 1. 通过工具`Tools/Image2XPM.exe`来转换 + 2. 这里把转换的xpm数组直接放到py文件中当做一个变量 + 3. 见xpmres.py中的image_head + 4. 此时可以通过`QPixmap(image_head)`来加载 + 5. 通过`QMovie`加载gif图片 + +![ShowImage](ScreenShot/ShowImage.gif) + +## 2、图片旋转 +[运行 ImageRotate.py](ImageRotate.py) + +1. 水平翻转 `QImage.mirrored(True, False)` +2. 垂直翻转 `QImage.mirrored(False, True)` +3. 旋转90的整数倍使用`QTransform`比较友好 +4. 任意角度采用`QPainter.rotate` + +![ImageRotate](ScreenShot/ImageRotate.gif) + +## 3、仿网页图片错位显示 +[运行 ImageSlipped.py](ImageSlipped.py) + +1. 设置`setMouseTracking(True)`开启鼠标跟踪 +2. 重写`mouseMoveEvent`鼠标移动事件获取偏移量 +3. 重写`paintEvent`事件绘制图片 + +![ImageSlipped](ScreenShot/ImageSlipped.gif) + +## 4、显示.9格式图片(气泡) +[运行 NinePatch.py](NinePatch.py) | [运行 QtNinePatch.py](QtNinePatch.py) | [运行 QtNinePatch2.py](QtNinePatch2.py) + +什么叫.9.PNG呢,这是安卓开发里面的一种特殊的图片 +这种格式的图片在android 环境下具有自适应调节大小的能力。 + +(1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展。 + +(2)允许开发人员定义内容显示区,用于显示文字或其他内容 + +目前手机QQ中很多漂亮的的聊天气泡就是.9格式的png图片 + +在Github开源库中搜索到两个C++版本的 + +1.一个是NinePatchQt https://github.com/Roninsc2/NinePatchQt + +2.一个是QtNinePatch https://github.com/soramimi/QtNinePatch + +### For PyQt +1、目前针对第一个库在2年前用Python参考源码重新写一个见 `Lib/NinePatch.py` + +2、这次针对第二个库用Python编写的见`Lib/QtNinePatch2.py`。用C++编写的pyd版本见`Lib/QtNinePatch`目录 + +### 说明 +1、建议优先使用pyd版本的(后续提供Python3.4 3.5 3.6 3.7 编译好的32为库文件),也可以自行编译,编译步骤见下文。 + +2、其次可以使用Python写的第二个版本`Lib/QtNinePatch2.py`(个人觉得方便调用) + +3、最后再考虑第一个版本吧 + +4、以上为个人意见,两个C++版本的写法不一样,但是核心算法应该是类似的。 + +### 自行编译 + +1、首先要安装好Qt、PyQt5、编译安装对应的sip、对应的VC++编译工具 + +2、用Qt Creator 打开pro文件进行编译 + +3、进入源码中的sip文件夹 + +4、修改`configure.py`文件 + +```python +# 这里是你的VC版本和对应的Qt目录中的文件夹 +config.platform = "win32-msvc2010" +qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010' +``` + +5、`python configure.py` + +![NinePatchImage](ScreenShot/NinePatchImage.gif) \ No newline at end of file diff --git a/图片/ScreenShot/图片旋转.gif b/QLabel/ScreenShot/ImageRotate.gif similarity index 100% rename from 图片/ScreenShot/图片旋转.gif rename to QLabel/ScreenShot/ImageRotate.gif diff --git a/图片/ScreenShot/仿网页图片错位特效.gif b/QLabel/ScreenShot/ImageSlipped.gif similarity index 100% rename from 图片/ScreenShot/仿网页图片错位特效.gif rename to QLabel/ScreenShot/ImageSlipped.gif diff --git a/图片/ScreenShot/仿网页图片错位特效2.gif b/QLabel/ScreenShot/ImageSlipped2.gif similarity index 100% rename from 图片/ScreenShot/仿网页图片错位特效2.gif rename to QLabel/ScreenShot/ImageSlipped2.gif diff --git a/图片/显示.9格式图片/ScreenShot/显示.9格式图片.gif b/QLabel/ScreenShot/NinePatchImage.gif similarity index 100% rename from 图片/显示.9格式图片/ScreenShot/显示.9格式图片.gif rename to QLabel/ScreenShot/NinePatchImage.gif diff --git a/图片/图片加载/ScreenShot/图片加载.gif b/QLabel/ScreenShot/ShowImage.gif similarity index 100% rename from 图片/图片加载/ScreenShot/图片加载.gif rename to QLabel/ScreenShot/ShowImage.gif diff --git a/图片/图片加载/图片加载.py b/QLabel/ShowImage.py similarity index 85% rename from 图片/图片加载/图片加载.py rename to QLabel/ShowImage.py index 7ec92e3..fddedf5 100644 --- a/图片/图片加载/图片加载.py +++ b/QLabel/ShowImage.py @@ -1,72 +1,72 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -''' -Created on 2017年12月23日 -@author: Irony."[讽刺] -@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447 -@email: 892768447@qq.com -@file: LoadImage -@description: -''' -import sys - -from PyQt5.QtCore import QResource -from PyQt5.QtGui import QPixmap, QMovie -from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QLabel - -import res_rc # @UnresolvedImport @UnusedImport -from xpmres import image_head # @UnresolvedImport - - -__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com" -__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]" -__Version__ = "Version 1.0" - - -class ImageView(QWidget): - - def __init__(self, *args, **kwargs): - super(ImageView, self).__init__(*args, **kwargs) - self.resize(800, 600) - layout = QHBoxLayout(self) - - # 从文件加载图片 - layout.addWidget(QLabel(self, pixmap=QPixmap("images/head.jpg"))) - - # QResource 参考 http://doc.qt.io/qt-5/resources.html - - # 从资源文件中加载1 from py file - # 转换命令pyrcc5 res.qrc -o res_rc.py - # 这种方式是从通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载 - # 此时可以通过路径:/images/head.jpg来访问 - layout.addWidget(QLabel(self, pixmap=QPixmap(":/images/head.jpg"))) - - # 从二进制资源文件res.rcc中加载 - # 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc - # 这里把资源前缀修改下(/myfile),见res2.qrc文件 - # 此时需要注册 - QResource.registerResource("res.rcc") - # 注意前缀 - layout.addWidget( - QLabel(self, pixmap=QPixmap(":/myfile/images/head.jpg"))) - - # 从xpm数组中加载 - # 通过工具tools/Image2XPM.exe来转换 - # 这里把转换的xpm数组直接放到py文件中当做一个变量 - # 见xpmres.py中的image_head - layout.addWidget(QLabel(self, pixmap=QPixmap(image_head))) - - # 加载gif图片 - movie = QMovie("images/loading.gif") - label = QLabel(self) - label.setMovie(movie) - layout.addWidget(label) - movie.start() - - -if __name__ == "__main__": - app = QApplication(sys.argv) - w = ImageView() - w.show() - sys.exit(app.exec_()) +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +''' +Created on 2017年12月23日 +@author: Irony."[讽刺] +@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447 +@email: 892768447@qq.com +@file: ShowImage +@description: +''' +import sys + +from PyQt5.QtCore import QResource +from PyQt5.QtGui import QPixmap, QMovie +from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QLabel + +from Lib import res_rc # @UnresolvedImport @UnusedImport +from Lib.xpmres import image_head # @UnresolvedImport + + +__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com" +__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]" +__Version__ = "Version 1.0" + + +class ImageView(QWidget): + + def __init__(self, *args, **kwargs): + super(ImageView, self).__init__(*args, **kwargs) + self.resize(800, 600) + layout = QHBoxLayout(self) + + # 从文件加载图片 + layout.addWidget(QLabel(self, pixmap=QPixmap("Data/head.jpg"))) + + # QResource 参考 http://doc.qt.io/qt-5/resources.html + + # 从资源文件中加载1 from py file + # 转换命令pyrcc5 res.qrc -o res_rc.py + # 这种方式是从通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载 + # 此时可以通过路径:/images/head.jpg来访问 + layout.addWidget(QLabel(self, pixmap=QPixmap(":/images/head.jpg"))) + + # 从二进制资源文件res.rcc中加载 + # 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc + # 这里把资源前缀修改下(/myfile),见res2.qrc文件 + # 此时需要注册 + QResource.registerResource("Data/res.rcc") + # 注意前缀 + layout.addWidget( + QLabel(self, pixmap=QPixmap(":/myfile/images/head.jpg"))) + + # 从xpm数组中加载 + # 通过工具tools/Image2XPM.exe来转换 + # 这里把转换的xpm数组直接放到py文件中当做一个变量 + # 见xpmres.py中的image_head + layout.addWidget(QLabel(self, pixmap=QPixmap(image_head))) + + # 加载gif图片 + movie = QMovie("Data/loading.gif") + label = QLabel(self) + label.setMovie(movie) + layout.addWidget(label) + movie.start() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + w = ImageView() + w.show() + sys.exit(app.exec_()) diff --git a/图片/图片加载/tools/Image2XPM.exe b/QLabel/Tools/Image2XPM.exe similarity index 100% rename from 图片/图片加载/tools/Image2XPM.exe rename to QLabel/Tools/Image2XPM.exe diff --git a/图片/图片加载/tools/rcc.exe b/QLabel/Tools/rcc.exe similarity index 100% rename from 图片/图片加载/tools/rcc.exe rename to QLabel/Tools/rcc.exe diff --git a/列表/README.md b/列表/README.md deleted file mode 100644 index 326e42a..0000000 --- a/列表/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# 列表 - -## [1、QListView](QListView/) - -### 1. [显示自定义Widget](QListView/显示自定义Widget.py) - -![截图](QListView/ScreenShot/显示自定义Widget.png) - -### 2. [显示自定义Widget并排序](QListView/显示自定义Widget并排序.py) - -![截图](QListView/ScreenShot/显示自定义Widget并排序.gif) - -## [2、QListWidget](QListWidget/) - -### 1. [自定义可拖拽Item](QListWidget/自定义可拖拽Item.py) - -![截图](QListWidget/ScreenShot/自定义可拖拽Item.gif) - -### 2. [腾讯视频热播列表](QListWidget/腾讯视频热播列表) -1. 使用`flowlayout`布局 -2. 使用`QGridLayout`布局 -3. 使用`QListWidget`,设置`self.setFlow(self.LeftToRight)`和`self.setWrapping(True)`达到横向自动排列 -4. 其它知识点: - 1. 使用`QNetworkAccessManager`进行异步下载数据和图片 - 2. 滚动条滑动到底部加载更多 - -![截图](QListWidget/腾讯视频热播列表/ScreenShot/1.gif) - -### 3. [删除自定义Item](QListWidget/删除自定义Item.py) -1. 删除item时先要通过`QListWidget.indexFromItem(item).row()`得到它的行数 -2. 通过`takeItem`函数取出该Item并删除掉,`item = self.listWidget.takeItem(row)` -3. 移除item对应的自定义控件`self.listWidget.removeItemWidget(item)` -4. 如果是清空所有Item,可以通过循环删除,但是删除的时候行号一直是0即可,原因和删除list数组一样。 - -![截图](QListWidget/ScreenShot/删除自定义Item.gif) \ No newline at end of file diff --git a/图片/README.md b/图片/README.md deleted file mode 100644 index 14c77a9..0000000 --- a/图片/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# 图片 - -## [1、图片加载](图片加载/) -通过3种方式加载图片文件和显示gif图片 - -1. 通过QPixmap("xxx.jpg")加载 -2. 通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载 - 1. 转换命令pyrcc5 res.qrc -o res_rc.py - 2. import res_rc - 3. 此时可以通过QPixmap(":/images/head.jpg")来加载 -3. 通过rcc命令转成为二进制文件res.rcc - 1. 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc - 2. 这里把资源前缀修改下(/myfile),见res2.qrc文件 - 3. 通过QResource.registerResource("res.rcc")注册 - 4. 此时可以通过QPixmap(":/myfile/images/head.jpg")来加载 -4. 通过xpm数组加载 - 1. 通过工具tools/Image2XPM.exe来转换 - 2. 这里把转换的xpm数组直接放到py文件中当做一个变量 - 3. 见xpmres.py中的image_head - 4. 此时可以通过QPixmap(image_head)来加载 - 5. 通过QMovie加载gif图片 - -![截图](图片加载/ScreenShot/图片加载.gif) - -## [2、仿网页图片错位特效](仿网页图片错位特效.py) -![截图](ScreenShot/仿网页图片错位特效.gif)![截图](ScreenShot/仿网页图片错位特效2.gif) - -## [3、显示.9格式图片](显示.9格式图片/) -详情见子目录[显示.9格式图片](显示.9格式图片/)里 - -![截图](显示.9格式图片/ScreenShot/显示.9格式图片.gif) - -## [4、图片旋转](图片旋转.py) -这里需要注意QTransform旋转的方式对90度的整数倍数比较友好, 由于这里测试旋转任意角度, 故采用`QPainter.rotate`来实现 - -![截图](ScreenShot/图片旋转.gif) \ No newline at end of file diff --git a/图片/图片加载/README.md b/图片/图片加载/README.md deleted file mode 100644 index 5b588b3..0000000 --- a/图片/图片加载/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# 图片加载测试 - -### [Python3.4.4 or Python3.5][PyQt5] - -### 一、通过3种方式加载图片文件和显示gif图片 - -1. 通过QPixmap("xxx.jpg")加载 -2. 通过pyrcc5转换res.qrc为res_rc.py文件,可以直接import加载 - - 转换命令pyrcc5 res.qrc -o res_rc.py - - import res_rc - - 此时可以通过QPixmap(":/images/head.jpg")来加载 -3. 通过rcc命令转成为二进制文件res.rcc - - 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc - - 这里把资源前缀修改下(/myfile),见res2.qrc文件 - - 通过QResource.registerResource("res.rcc")注册 - - 此时可以通过QPixmap(":/myfile/images/head.jpg")来加载 -4. 通过xpm数组加载 - - 通过工具tools/Image2XPM.exe来转换 - - 这里把转换的xpm数组直接放到py文件中当做一个变量 - - 见xpmres.py中的image_head - - 此时可以通过QPixmap(image_head)来加载 -5. 通过QMovie加载gif图片 - -# 截图 -![截图](ScreenShot/1.gif) \ No newline at end of file diff --git a/图片/图片加载/res_rc.py b/图片/图片加载/res_rc.py deleted file mode 100644 index 76f7786..0000000 --- a/图片/图片加载/res_rc.py +++ /dev/null @@ -1,471 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.9.3) -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore - -qt_resource_data = b"\ -\x00\x00\x19\xf0\ -\xff\ -\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x78\x00\ -\x78\x00\x00\xff\xe1\x00\x3a\x45\x78\x69\x66\x00\x00\x4d\x4d\x00\ -\x2a\x00\x00\x00\x08\x00\x03\x51\x10\x00\x01\x00\x00\x00\x01\x01\ -\x00\x00\x00\x51\x11\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x51\ -\x12\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\ -\xdb\x00\x43\x00\x02\x01\x01\x02\x01\x01\x02\x02\x02\x02\x02\x02\ -\x02\x02\x03\x05\x03\x03\x03\x03\x03\x06\x04\x04\x03\x05\x07\x06\ -\x07\x07\x07\x06\x07\x07\x08\x09\x0b\x09\x08\x08\x0a\x08\x07\x07\ -\x0a\x0d\x0a\x0a\x0b\x0c\x0c\x0c\x0c\x07\x09\x0e\x0f\x0d\x0c\x0e\ -\x0b\x0c\x0c\x0c\xff\xdb\x00\x43\x01\x02\x02\x02\x03\x03\x03\x06\ -\x03\x03\x06\x0c\x08\x07\x08\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x78\ -\x00\x78\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\ -\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff\xc4\x00\ -\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\ -\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\ -\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\x42\xb1\xc1\x15\x52\ -\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17\x18\x19\x1a\x25\x26\ -\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\ -\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\ -\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x83\x84\x85\x86\x87\ -\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\ -\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\ -\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\ -\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\ -\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\ -\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\ -\x07\x08\x09\x0a\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\ -\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00\x01\x02\x03\x11\x04\ -\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81\x08\x14\ -\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15\x62\x72\xd1\x0a\x16\ -\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27\x28\x29\x2a\x35\x36\ -\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\ -\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\ -\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\ -\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\ -\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\ -\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\ -\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\ -\x03\x01\x00\x02\x11\x03\x11\x00\x3f\x00\xfd\xfc\xa2\xbc\x87\xf6\ -\xf5\xf8\xc3\xe2\xef\x80\x1f\xb1\xff\x00\x8f\x3c\x65\xe0\x5d\x36\ -\xcf\x53\xf1\x3f\x87\xb4\xef\xb5\xda\xa5\xdd\xb4\xb7\x50\x5b\xa0\ -\x74\x13\x5c\xc9\x0c\x4c\xb2\x4c\xb0\x42\x64\x98\xc6\x8c\x19\xc4\ -\x5b\x41\x04\x8a\xf0\x6f\x1f\x7f\xc1\x4c\xbe\x20\x7e\xc7\xdf\x04\ -\x34\xef\x88\x9f\x1a\x3e\x1e\x68\x3e\x22\xf8\x67\x34\x30\xdd\x5c\ -\xf8\xf7\xe1\xae\xb0\x6f\xb4\xf8\x2d\xa7\x09\xe4\x5d\x49\x63\x74\ -\xb1\xcf\x1c\x72\x17\x5e\x52\x49\x80\x2c\xa3\x71\xc8\xc8\x07\xda\ -\xf4\x57\x8e\x7e\xca\xdf\xf0\x50\x4f\x82\xff\x00\xb6\xbf\x83\xe1\ -\xd6\xbe\x18\xfc\x47\xf0\xb7\x8a\xad\xe4\x00\xbd\xbd\xbd\xea\xa5\ -\xed\xa9\x3f\xc3\x2d\xbb\xe2\x58\xdb\xd9\x94\x67\xb6\x6b\xd8\xe8\ -\x00\xa2\xbe\x49\xff\x00\x82\x80\x7f\xc1\x6e\xff\x00\x67\x5f\xf8\ -\x26\xfc\x37\x16\x7e\x3c\xf1\xc5\xad\xf7\x8a\xa1\x52\x57\xc3\x1a\ -\x16\xdd\x43\x56\x27\x9e\x1e\x35\x60\xb0\xfd\x66\x64\xf6\xcd\x7c\ -\x51\xf1\x37\xfe\x0f\x47\xfd\x9f\x7c\x3a\x92\x7f\xc2\x2b\xf0\xff\ -\x00\xe2\x47\x89\xda\x34\x8d\x81\xb8\x5b\x6d\x35\x19\x9b\xef\x28\ -\xcc\x8e\xdf\x2f\xae\xdc\x1e\xd4\x01\xfb\x1b\x45\x7f\x3b\x7f\x19\ -\xff\x00\xe0\xf7\x3f\x19\x5d\xeb\x93\x2f\xc3\xef\x82\xde\x18\xd3\ -\xb4\xd5\x38\x8a\x4d\x7b\x52\x9e\xf6\x77\x1e\xac\xb0\xf9\x2a\xa7\ -\xd8\x16\xfa\xd7\x07\xa3\xff\x00\xc1\xec\x3f\x1f\x6d\x2e\xc3\x5e\ -\xfc\x2e\xf8\x4b\x79\x06\x79\x48\xe3\xbf\x85\xb1\xec\xdf\x68\x61\ -\xfa\x50\x07\xf4\xc1\x58\x3f\x14\x7c\x7f\x67\xf0\xab\xe1\xbe\xbd\ -\xe2\x6b\xf0\xcd\x67\xa0\xd8\x4d\x7f\x2a\xa9\xf9\xa4\x11\xa1\x6d\ -\xa3\xfd\xa6\xc6\x07\xb9\x15\xf8\x63\xf0\x37\xfe\x0f\x74\xd3\xef\ -\xee\xa3\x87\xe2\x27\xc0\xd9\xac\xe3\x66\x02\x4b\x9d\x03\x5f\x12\ -\x32\x8e\xe4\x45\x3c\x4a\x0f\xd0\xca\x2b\xf4\x53\xe1\xc7\xfc\x15\ -\x07\xe0\xbf\xfc\x15\x1b\xe0\x8f\x86\xed\x7e\x18\xf8\x9a\x3b\xfb\ -\x8f\x11\x78\x97\x4a\xb4\xd5\x34\x0b\xf4\xfb\x26\xaf\x61\x6e\x97\ -\x2b\x73\x2f\x9b\x6e\xc7\x26\x36\x8e\xdd\xd7\xcc\x42\xf1\x90\xd8\ -\x0c\x7a\x50\x07\x5d\xf0\x87\xf6\xd1\xf1\x27\xc2\xcf\xda\x83\x41\ -\xf8\x33\xf1\xc3\xfb\x3a\xc7\xc4\x5f\x11\x34\x81\xae\xf8\x27\x5c\ -\xb6\x87\xec\xd6\x3a\xbc\xca\xa1\xaf\xb4\x56\x19\x21\x6e\xed\x09\ -\x0c\x87\x3f\xbe\x85\x95\xb8\x75\x60\x7e\xaa\xaf\x8b\x3f\xe0\xe0\ -\x0f\xd9\xbe\xf3\xf6\x82\xff\x00\x82\x63\xf8\xea\xff\x00\x41\x4b\ -\x98\xfc\x69\xf0\xc7\xc9\xf1\xdf\x86\xef\x2c\xdc\xc5\x79\x65\x75\ -\xa7\x38\x9d\xde\x09\x17\xe6\x49\x0c\x02\x65\x05\x79\xc9\x15\xc3\ -\x7f\xc1\xbd\xff\x00\xf0\x59\xbb\x5f\xf8\x2a\x7f\xec\xfb\x7d\xa3\ -\x78\x9a\xea\xc9\x7e\x2d\x7c\x3d\x58\xa0\xd6\x96\x30\x21\xfe\xdc\ -\xb5\x60\x04\x5a\x94\x71\x7f\x06\xe3\x94\x95\x57\x2a\x92\x0c\x8c\ -\x2c\x88\x28\x03\xf4\x32\x8a\x28\xa0\x02\x8a\x28\xa0\x06\x5c\x5b\ -\xc7\x79\x6f\x24\x33\x46\xb2\x45\x2a\x94\x74\x61\x95\x75\x3c\x10\ -\x47\xa1\xaf\x92\x7f\xe0\x99\x1f\x0f\x74\x2f\x8c\x5f\xf0\x4b\xcd\ -\x33\xe1\xbf\x8b\xf4\xcb\x4d\x7f\x41\xd3\x64\xd7\x7c\x0d\xaa\x69\ -\x97\xa9\xe6\x45\x2d\xb5\x9e\xa9\x79\x64\x20\x60\x7b\x08\x62\x40\ -\x31\xd3\x00\x8c\x60\x57\xd7\x35\xf2\x7f\xc0\x2b\xc9\x3f\x63\xcf\ -\xdb\x87\xc7\x9f\x0c\xf5\x80\x6d\xfc\x23\xf1\xa3\x55\xb8\xf1\xd7\ -\x81\x6f\xdb\x88\x4e\xa5\x24\x6a\x75\x7d\x24\xb7\x41\x2f\x98\x9f\ -\x6c\x8d\x7f\x8d\x27\x9f\x19\xf2\x9a\x80\x3f\x9f\xcf\xf8\x2c\xe7\ -\xfc\x10\x8b\xe2\x67\xfc\x11\xe7\xe2\x95\xd7\xc5\x4f\x84\x7a\x86\ -\xbd\xa9\x7c\x20\x6b\x8f\x36\xcf\x59\xb3\x99\x86\xa1\xe1\x62\xef\ -\x81\x6d\x78\x57\xac\x7b\x88\x55\x9b\xee\xb8\x20\x30\x0d\xc1\xf2\ -\x0f\x08\x7f\xc1\xc3\xdf\xb4\xce\x91\xfb\x3d\x6b\x1f\x0e\xb5\x2f\ -\x88\xfe\x20\xbc\xd1\xef\x97\x6d\xb4\xb6\xaf\x1d\x9d\xf4\x00\xae\ -\xd6\x8b\xed\x4a\xbe\x6a\xc2\x7a\x94\x8c\xa9\x27\x20\x32\x82\x6b\ -\xee\x6f\xf8\x3b\x97\xfe\x0b\x01\x75\xe3\x7f\x88\xb2\x7e\xcb\xfe\ -\x03\xd4\xb6\x68\x3e\x1d\x68\xee\x7c\x6d\x73\x03\x7f\xc7\xf5\xef\ -\x0f\x15\x96\x7f\xbb\x08\xda\xee\x3f\xe7\xa1\x00\xf2\x95\xf8\x5f\ -\x40\x16\x35\x6d\x5a\xe7\x5d\xd4\xa7\xbc\xbc\x9a\x5b\x8b\xab\xa9\ -\x1a\x59\x65\x91\x8b\x34\x8e\xc7\x25\x89\x3c\x92\x7d\x4d\x57\xa2\ -\x8a\x00\x28\xa2\x8a\x00\x2b\xf4\x47\xfe\x0d\x7e\xf8\xdd\xa4\x7c\ -\x2d\xff\x00\x82\xbe\xfc\x35\xb7\xf1\x46\xa8\x2c\xf4\x8d\x59\x2f\ -\xb4\xeb\x2f\xb4\x49\x88\x63\xbe\x9a\xd6\x44\x83\xaf\x00\xb3\x31\ -\x41\xd0\x65\xc7\xb5\x7e\x77\x55\xef\x0d\x78\x8e\xf7\xc1\xfe\x22\ -\xb0\xd5\xb4\xdb\x89\x2d\x35\x0d\x2e\xe2\x3b\xbb\x59\xe3\x38\x68\ -\x65\x46\x0c\xac\x3d\xc3\x00\x68\x03\xfb\xe1\xd5\x34\xdb\x1f\x18\ -\x78\x72\xe2\xce\xe1\x61\xbd\xd3\x75\x4b\x66\x86\x55\xc8\x68\xe7\ -\x8a\x45\x20\x8f\x42\xac\xa7\xf1\x06\xbf\x8c\x4f\xd9\xe7\xf6\x8f\ -\xf1\x37\xfc\x11\x8f\xfe\x0a\xc7\x79\xe2\x2d\x0d\x6e\x1b\xfe\x15\ -\xaf\x8b\x2f\xf4\x4d\x4f\x4f\x0f\xb4\x6a\xda\x62\xdc\x3c\x33\xdb\ -\xb7\x6f\x9e\x21\x95\x27\x21\x5d\x51\xba\xa8\xaf\x70\xfd\x85\x3f\ -\xe0\xe5\xef\x8f\x5f\xb2\xcc\x27\x45\xd4\xf5\xcb\x7d\x5f\x43\x68\ -\xed\x2d\x2d\x5e\xea\xd4\xdc\x7f\x64\xda\xc1\x34\x92\x0b\x78\x60\ -\xde\x23\x58\xd9\x65\x74\x24\x28\x90\x05\x8f\x0d\x84\xda\x7c\x5f\ -\xfe\x0a\x91\xf1\xf3\xc0\x9f\xb7\x4f\xc6\xe3\xf1\x5f\xc2\xf7\xba\ -\x7e\x9f\xe2\x2f\x14\x41\x68\x3c\x41\x65\x24\x0b\x61\xe6\x5e\x6c\ -\x21\xa6\x75\xc0\x8f\xcc\x2a\x14\x4b\x24\x78\x8d\x99\x77\xe1\x0c\ -\x8c\x8a\x01\xfd\x8e\x7c\x1e\xf8\xb5\xa0\x7c\x7a\xf8\x53\xe1\xcf\ -\x1b\x78\x57\x50\x87\x56\xf0\xdf\x8a\xf4\xe8\x35\x5d\x36\xee\x23\ -\x95\x9e\x09\x90\x3a\x37\xb1\xc3\x0c\x83\xc8\x39\x07\x91\x5d\x25\ -\x7e\x1b\xff\x00\xc1\xa6\xdf\xf0\x54\x4d\x23\x48\xf8\x67\xa4\x7e\ -\xcb\x7e\x32\x76\xd2\xf5\xfb\x67\xbc\xbe\xf0\xb4\xb7\x53\xb3\x7d\ -\xb4\x3b\xb5\xc4\x96\xca\x49\xda\x32\xa5\xe4\x8c\x2e\x01\x0b\x20\ -\xe4\xed\x2d\xfb\x91\x40\x05\x14\x51\x40\x05\x7c\xc7\xff\x00\x05\ -\x87\xf8\xe7\xe0\xcf\xd9\x9b\xfe\x09\xe9\xf1\x03\xc7\xfe\x34\xd3\ -\xe1\xd4\xa1\xf0\xa5\xb4\x77\xda\x24\x26\x53\x0c\xeb\xac\x07\x0b\ -\x60\xf0\x4a\xa4\x3c\x72\xac\xec\x84\x3a\x10\xc1\x43\x76\xc8\x3f\ -\x4e\x57\xe1\xbf\xfc\x1e\xbb\xfb\x55\x2f\x86\xbe\x03\xfc\x2c\xf8\ -\x37\x6b\x20\x37\x1e\x28\xd4\xa5\xf1\x2e\xa0\x81\xb0\x52\x1b\x51\ -\xe5\x41\x9f\x50\xcf\x2c\xbf\x8c\x7e\xd4\x01\xfc\xf0\xf8\xfb\xc7\ -\x5a\xb7\xc5\x0f\x1c\x6b\x1e\x24\xd7\xaf\xae\x35\x4d\x73\x5e\xbd\ -\x9b\x50\xbf\xbc\x9d\xb7\x49\x73\x3c\xae\x5e\x47\x63\xea\x59\x89\ -\xfc\x6b\x26\x8a\xfd\x0c\xff\x00\x82\x00\x7f\xc1\x1c\x97\xfe\x0a\ -\x5f\xf1\xa7\x56\xf1\x67\x8e\x05\xc5\x8f\xc1\x5f\x86\x2a\x2f\xbc\ -\x45\x32\x13\x1b\xeb\x12\xaa\x99\x12\xc2\x37\xfe\x1d\xca\xa5\xa4\ -\x61\xca\xa0\xc0\xc3\x32\x9a\x00\xfc\xf3\xa2\xba\x2f\x8b\xbe\x28\ -\xb7\xf1\xb7\xc5\x4f\x11\xea\xf6\x76\x96\xba\x7d\x96\xa5\xa9\x5c\ -\x5c\x5b\x5a\xdb\x46\x23\x86\xda\x26\x91\x8a\x46\x8a\x38\x0a\xab\ -\x85\x03\xd0\x57\x3b\x40\x16\x34\xbd\x22\xef\x5b\xba\x30\x59\xda\ -\xdc\x5e\x4c\xb1\xbc\xc6\x38\x63\x32\x30\x44\x42\xee\xd8\x1c\xed\ -\x54\x56\x62\x7a\x00\xa4\x9e\x05\x57\xaf\xbb\xbf\xe0\xda\xbf\x87\ -\x31\xfc\x51\xff\x00\x82\xc8\xfc\x2a\xd2\xee\x6c\xe1\xbe\xd3\x5e\ -\x3d\x55\xb5\x0b\x79\xa3\xf3\x22\x9e\xd8\xe9\x97\x4b\x2a\x38\xe8\ -\x55\x95\x8a\x9c\xff\x00\x7a\xb8\x6f\xf8\x2d\x1f\xfc\x13\xff\x00\ -\x4b\xff\x00\x82\x79\xfe\xdc\x7e\x28\xf0\x9f\x85\x75\x9b\x3f\x10\ -\x78\x1a\xf2\xe5\xee\xf4\x3b\xab\x69\xbc\xef\xb1\xc6\xcc\x77\x59\ -\x4c\xc3\x8f\x3a\x06\xca\x11\xd4\x80\xad\xc6\x71\x40\x1f\x25\x51\ -\x45\x14\x00\x51\x45\x14\x01\xd5\x7c\x1d\xf8\xc7\xe2\x0f\x81\xff\ -\x00\x14\x3c\x37\xe2\xef\x0d\xea\x37\x1a\x7e\xbd\xe1\x3d\x46\x0d\ -\x53\x4c\xb9\x47\x39\xb6\x9e\x19\x04\x88\x47\xb6\xe0\x32\x3b\x8c\ -\x8e\xf5\xfd\xc1\x7e\xc5\x5f\xb4\xde\x97\xfb\x66\x7e\xc9\xbf\x0f\ -\xbe\x29\x68\xfb\x56\xcb\xc6\xda\x25\xbe\xa4\x62\x5f\xf9\x76\x99\ -\x97\x13\x43\xf5\x8e\x51\x22\x1f\x74\xaf\xe1\x51\x4e\x18\x57\xf5\ -\x01\xff\x00\x06\x71\x7e\xd2\x8f\xf1\x27\xf6\x06\xf1\x77\xc3\x9b\ -\xb9\xcc\x97\x5f\x0e\x3c\x42\x2e\x2d\x15\x9f\x25\x2c\xb5\x08\xfc\ -\xe5\x00\x7a\x0b\x88\xee\xbf\x3a\x00\xfd\x7b\xa2\x8a\x28\x00\xaf\ -\xe4\x5b\xfe\x0e\x87\xfd\xab\x47\xed\x37\xff\x00\x05\x65\xf1\xa5\ -\x9d\xac\x8d\x26\x97\xf0\xee\x38\xbc\x2f\x6a\x77\xee\x52\x61\x5d\ -\xd3\x15\xf6\xf3\x9e\x4a\xfe\xb2\xfe\x28\xf8\xc5\x7e\x1d\xfc\x33\ -\xf1\x17\x88\x1b\x69\x5d\x0f\x4c\xb9\xbf\x20\xf4\x3e\x54\x4c\xf8\ -\xff\x00\xc7\x6b\xf8\x79\xfd\xbb\x3c\x49\xff\x00\x09\x6f\xed\x8d\ -\xf1\x2b\x50\xf3\x1a\x66\xb9\xf1\x05\xdb\x33\xb1\xcb\x3b\x07\x20\ -\x93\xf5\x20\x9a\x00\xf3\x5f\x0c\x78\x6e\xfb\xc6\x5e\x24\xd3\xf4\ -\x8d\x36\xde\x5b\xcd\x47\x54\xb9\x8e\xd2\xd6\x08\xd7\x73\xcd\x2c\ -\x8c\x15\x14\x0e\xe4\xb1\x03\xf1\xaf\xeb\xeb\xf6\x64\xff\x00\x82\ -\x5b\x78\x4f\xf6\x15\xff\x00\x82\x5a\x58\xf8\x5e\xdf\x4f\x92\xf3\ -\xc7\x9e\x0b\xf0\x4e\xad\x79\x73\x3c\x37\xb3\x2a\x4b\xac\x5d\xd8\ -\xcb\xf6\x99\x0c\x48\xe2\x39\x1b\x27\xca\x47\x75\x2c\x12\x35\x00\ -\x8a\xfe\x57\x3f\x61\x4f\x88\xf6\x1f\x02\x3e\x3f\xe9\x7f\x11\xb5\ -\x38\x74\x8b\x9b\x7f\x01\x93\xaa\xdb\xc1\xa9\x43\x24\xf0\xdd\x5d\ -\xaf\x16\xf1\x88\xa3\x64\x69\x1b\xcc\x2a\xc1\x77\xa2\xfc\x84\xb3\ -\x00\x39\xf7\xfb\x0f\xf8\x38\x6b\xf6\x94\xf0\xb7\xc4\x4d\x67\x5e\ -\xf0\xe6\xbd\xe1\x3f\x0f\x7f\x6e\x42\xf6\x77\x50\x59\x78\x47\x4d\ -\x8d\x2e\x2d\x98\x9c\xc7\x21\xf2\x77\x37\xd4\xb6\x73\xde\x80\x3e\ -\x1e\xb9\x84\xdb\xdc\x49\x19\xeb\x1b\x15\x3f\x85\x32\xa6\xd4\x2e\ -\xda\xfe\xfe\x69\xdf\x6e\xf9\xa4\x69\x1b\x68\xc0\xc9\x39\xe0\x54\ -\x34\x01\xfb\x29\xff\x00\x06\x5e\xfe\xcf\x32\x78\xdb\xf6\xec\xf1\ -\xe7\xc4\x8b\x88\x5b\xfb\x3b\xe1\xff\x00\x85\xda\xd5\x27\x23\xe5\ -\x4b\xab\xd9\x02\x28\xcf\x6f\xdc\xc5\x71\x5f\xae\xdf\xf0\x56\xe9\ -\xff\x00\x66\x7f\xdb\x6b\xf6\x67\xd4\xbe\x15\xfc\x46\xd7\x22\x5b\ -\x5b\xe9\xc7\xf6\x57\x88\xac\x6d\xc3\x43\xe1\xdb\xf0\x76\xa5\xd4\ -\x77\x2e\x56\x16\x08\x49\x12\x22\x39\xca\x6f\x07\x1d\x47\x85\x7f\ -\xc1\x0d\x3f\xe0\x98\x7e\x3c\xfd\x9d\xbf\xe0\x91\xbe\x1d\xf0\xf6\ -\x9c\xf6\x3e\x11\xf1\x57\xc7\x8b\xa3\xe2\x4f\x18\x6b\x57\x96\xcb\ -\x71\x75\xa1\x69\x4f\x12\x8b\x6b\x78\x2d\xdf\xe5\x7b\x86\x80\x29\ -\x1e\x68\x29\x13\x4f\x29\x65\x72\xa1\x1b\xf0\x03\xfe\x0a\x81\xfb\ -\x4c\x69\xbf\x1b\xff\x00\x6b\x1f\x19\x47\xe1\x3f\xed\x01\xe1\x3d\ -\x1f\x50\x9b\x48\xd2\xee\x75\x0b\xd9\x2f\xaf\xf5\x0b\x68\x1c\xc6\ -\x2e\x26\x9e\x42\x58\xb4\xc5\x4c\x85\x53\x6a\x28\x65\x55\x55\x55\ -\x02\x80\x3c\xbb\xf6\xab\xfd\x9b\x75\x4f\xd9\x3b\xe3\x96\xb9\xe0\ -\x9d\x53\x54\xf0\xff\x00\x88\x1b\x49\x9c\xad\xb6\xad\xa1\x6a\x31\ -\x6a\x1a\x6e\xab\x01\xe6\x39\xe1\x9a\x36\x2a\x55\x97\x07\x07\x0c\ -\xa7\x20\x80\x41\x15\xe7\x55\x7d\x3c\x43\x33\x68\xc3\x4f\x99\x63\ -\x9a\xd5\x18\xbc\x41\x94\x6f\x85\x8f\x52\xad\xd4\x03\x8e\x47\x43\ -\xe9\x9e\x6b\xd1\xfe\x32\xfe\xc5\x3f\x12\xfe\x05\xfc\x27\xf0\x4f\ -\x8f\xb5\xff\x00\x09\xea\xf6\xbe\x07\xf8\x89\xa7\xae\xa5\xa0\x6b\ -\x62\x02\xf6\x77\x88\x49\x05\x0c\x83\x84\x91\x4a\x9c\xa3\x60\x91\ -\x86\x00\xa9\x06\x80\x3c\xa6\x8a\x28\xa0\x02\xbf\x6c\xff\x00\xe0\ -\xcb\x5f\x89\xb3\x69\x3f\xb6\x5f\xc4\x0f\x0c\x33\xb0\xb7\xd7\xbc\ -\x12\x6e\x0a\xe7\xe5\x69\x2d\x2f\xa3\xd8\x71\xea\x12\xe6\x41\xf8\ -\xd7\xe2\x65\x7e\xb7\x7f\xc1\xa0\x1e\x26\xb5\xd0\x7f\xe0\xa5\x9a\ -\x7c\x12\x17\xfb\x56\xb5\xa1\x6b\x5a\x6c\x63\xf8\x71\xe5\x5a\xdc\ -\x8f\xfd\x27\x7f\xce\x80\x3f\xa8\xea\x28\xa2\x80\x3c\xbf\xf6\xcf\ -\x2f\x27\xec\xc3\xe2\xeb\x78\xdb\x6b\x5f\xdb\x25\x89\x27\xd2\x79\ -\xa3\x84\xfe\x8e\x6b\xf8\x9c\xfd\xb2\x34\x1b\x8f\x0c\x7e\xd6\xff\ -\x00\x14\x34\xeb\xa4\x68\xe7\xb1\xf1\x66\xab\x6e\xea\x47\x2a\x52\ -\xf2\x55\x23\xf4\xaf\xee\x27\xe3\x6f\x80\x24\xf8\xa3\xf0\xab\x5a\ -\xd0\xa1\x99\x60\xb8\xbe\x80\x79\x12\x30\xf9\x52\x54\x61\x22\x13\ -\xed\xb9\x57\x3e\xd5\xfc\x93\xff\x00\xc1\xc5\xbf\xb2\x56\xa5\xfb\ -\x3e\xff\x00\xc1\x4f\xfe\x32\x6a\x1f\x63\x92\x2d\x1f\x5c\xf1\x02\ -\x6b\xd0\x36\xcc\x2f\x97\xa9\xc6\xd7\x4a\x47\xb7\x9c\xb7\x49\xec\ -\x63\x22\x80\x3e\x78\x87\xf6\x5b\xd6\x13\xfe\x09\xd9\x2f\xc6\x2f\ -\x29\xbf\xb1\x24\xf1\xbf\xfc\x23\x3e\x66\x38\xf3\x56\xd1\x66\xc7\ -\xe2\x1b\xff\x00\x1d\x35\x3f\xed\x57\xe0\xef\x80\xfe\x1f\xfd\x9e\ -\x7e\x06\x6a\x1f\x0a\x7c\x4d\xe2\x0d\x63\xe2\x06\xb1\xa1\x5c\xc9\ -\xf1\x27\x4f\xd4\x22\x65\x83\x48\xd4\x16\x65\x11\x2c\x04\xc6\xa0\ -\xab\x29\x93\x85\x67\x1b\x52\x32\x48\x66\x22\xbf\x63\x3f\xe0\xdd\ -\xff\x00\xd9\xb3\xc1\x5f\xf0\x54\x7f\xf8\x22\x57\xc6\x2f\xd9\xaf\ -\xc6\x30\xff\x00\x67\x9d\x1f\xc5\x11\xea\x76\xfa\x9d\xaa\x06\xb9\ -\xd3\xee\x2e\xad\xa3\x9a\xd6\xed\x73\xc1\x64\x78\x64\x52\x38\xdd\ -\x1e\xe5\x38\xc9\x35\xf2\xb7\x89\xff\x00\xe0\xce\x8f\xda\xc7\x4b\ -\xf8\x91\x75\xa4\xe9\xb7\x5f\x0d\x75\x5d\x0e\x36\xcc\x1a\xe9\xd7\ -\x1a\xde\x09\x97\x23\xac\x2d\x11\x99\x58\x0e\x48\xda\x47\x1c\x31\ -\xe3\x20\x1f\x9e\xfa\xbf\xec\xbb\xab\x69\x1f\x03\x5b\xc7\x53\xc7\ -\x71\x0e\x9a\xda\x55\x86\xa5\x13\x3a\x61\x66\xfb\x55\xed\xdd\xa2\ -\x80\x7b\xf3\x67\x31\xff\x00\x80\x9a\xfb\xcf\xfe\x0d\xc3\xff\x00\ -\x82\x20\x6a\x1f\xf0\x50\x5f\xda\x07\x4c\xf8\x8d\xe3\xad\x26\x64\ -\xf8\x3b\xe0\x3b\xe4\xbb\xbd\xfb\x44\x65\x62\xf1\x15\xe4\x78\x78\ -\xb4\xf4\xcf\xdf\x4c\xed\x79\x88\xe1\x50\x04\xce\xe9\x3e\x5f\xde\ -\xef\x86\x9f\xf0\x44\x4f\x82\x5a\x7f\xec\x65\xf0\xd3\xe1\x0f\x8e\ -\x3c\x37\x6b\xe3\x0b\x3f\x02\xe9\xba\x75\xad\xe5\xcb\x49\x2d\xb0\ -\xd6\xe6\xb4\x69\xe6\xcc\xc1\x18\x16\x84\xdc\x5d\x5c\xc8\x22\x62\ -\x47\xef\x30\x73\x8a\xfa\xbb\xe1\xf7\xc3\xcd\x07\xe1\x3f\x83\x34\ -\xff\x00\x0e\xf8\x67\x47\xd3\x7c\x3f\xa0\xe9\x30\x88\x2c\xb4\xfb\ -\x0b\x75\xb7\xb7\xb6\x41\xfc\x28\x8a\x00\x1d\xcf\xb9\x24\xf5\x34\ -\x01\x37\x8a\x74\x99\xb5\x5f\x08\xea\x56\x36\x6e\xb6\xd3\xdc\xd9\ -\xcb\x04\x0e\x38\x11\x33\x21\x55\x3f\x81\x23\xf2\xaf\xe1\x87\xe1\ -\x77\x8a\xee\xff\x00\x64\x0f\xda\xfb\xc3\xfa\xdf\x88\x34\x1b\x5d\ -\x77\x50\xf8\x65\xe2\xe8\x2e\xf5\x3d\x16\xf7\xfd\x4d\xec\xb6\x37\ -\x81\xa5\xb6\x90\x90\x78\x66\x89\x94\x92\x0f\x5e\x87\xa5\x7f\x76\ -\x15\xf8\xef\xff\x00\x05\x75\xff\x00\x83\x4e\xfc\x3d\xfb\x73\xfc\ -\x7b\xd6\xbe\x2a\x7c\x29\xf1\xb5\xa7\xc3\xbf\x15\x78\xaa\xe0\xde\ -\x6b\xba\x4e\xa5\x62\xd7\x1a\x55\xfd\xd3\x7f\xac\xb9\x8d\xa3\x22\ -\x48\x1d\xcf\xcc\xe3\x6b\xab\x31\x66\x1b\x49\x39\x00\xfe\x7b\x3f\ -\x6f\xff\x00\xda\x8a\xc7\xf6\xd4\xfd\xb2\xbe\x21\x7c\x54\xd3\x3c\ -\x2b\x67\xe0\x8b\x1f\x1b\x6a\x87\x50\x87\x45\xb6\x90\x4a\x96\x43\ -\x62\x21\xcb\xaa\x20\x67\x62\xa5\xd9\x82\x8c\xb3\xb1\xc5\x7e\xec\ -\xfc\x7b\xf8\x13\xac\x37\xfc\x19\x93\xe1\x7b\x3d\x69\x6e\xad\x75\ -\x6d\x07\xc3\x9a\x77\x89\xa1\x07\x2a\xe9\x0b\x6a\xa2\xe2\x1c\xf7\ -\xc1\xb7\x9d\x7e\x99\xaf\x31\xf8\x2b\xff\x00\x06\xa1\xfc\x25\xfd\ -\x91\x3e\x2a\x78\x27\x50\xfd\xa6\x7e\x3a\x59\xeb\x50\xea\xd7\x8e\ -\xd6\xbe\x15\xd0\xf4\x99\x6d\xe1\xd5\x3e\xce\xbe\x6c\xa6\x6b\x92\ -\xcd\x22\xda\x46\x83\x74\xd2\x18\xe2\x54\x53\xcc\x89\x90\x4f\xe9\ -\x77\xfc\x16\x2f\xc7\x3e\x0c\xf8\xb1\xff\x00\x04\x3e\xf8\xf1\x75\ -\xe0\xbd\x57\x43\xd6\x3c\x33\x67\xe1\x79\xac\xe0\x9b\x4a\x95\x24\ -\xb3\x88\xdb\xcb\x1a\x98\x90\xa7\xcb\x84\x2a\x17\x03\x81\x8c\x76\ -\xa0\x0f\xe3\xa6\xea\xe9\xef\x27\x69\x24\x21\xa4\x73\x96\x20\x01\ -\x93\xf8\x54\x74\x51\x40\x05\x7e\xc4\x7f\xc1\xaa\xbf\x09\x5b\x4d\ -\xfd\xaa\xfe\x10\xf8\xf3\xec\xf2\x08\xf5\x0f\x13\x78\x97\x42\x69\ -\x73\xf2\xb3\x27\x87\xfc\xe5\x1f\x80\x2f\x5f\x8e\xf5\xfd\x49\x7f\ -\xc1\xae\xdf\xb1\x43\x78\x63\xfe\x09\xbd\xf0\xc3\xc5\x1a\xe6\x9f\ -\x2d\x8e\xb1\x63\xe3\xad\x73\xc5\x10\x09\x17\x6c\x83\x7d\x9c\x9a\ -\x56\xd3\xe9\xc6\xf3\x8f\xf6\x45\x00\x7e\xb5\x51\x45\x14\x00\x57\ -\xc7\xdf\xf0\x57\x2f\xf8\x25\x0f\x87\x7f\xe0\xa5\xdf\x06\xf5\x6b\ -\x36\xfb\x35\x8f\x8b\x7f\xb0\x6e\xb4\xbb\x1b\xb9\x23\x1b\x64\x62\ -\xc9\x3d\xb6\xf6\xea\x3c\xab\x88\x94\x83\xd9\x65\x9c\x63\xe7\x35\ -\xf6\x0d\x14\x01\xf8\x37\xff\x00\x06\x65\x49\x6f\xf0\xaf\xe2\xc7\ -\xed\x49\xf0\xd3\x56\xba\x6b\x7f\x16\xe8\xf7\x9a\x52\xc9\x61\x32\ -\xf9\x72\xb2\x59\xc9\x7b\x6b\x3b\x6c\xc9\xff\x00\x57\x2b\x22\xb7\ -\x27\x05\xd7\xd6\xbf\x79\x2b\xf9\x65\xfd\xbb\x3e\x2a\xf8\xeb\xfe\ -\x08\x8f\xff\x00\x07\x0d\xfc\x50\xf8\x9f\xe0\xdb\x1b\x7b\xff\x00\ -\x33\x56\x3e\x23\x96\xc2\xf0\xed\xb7\xd6\x74\x8d\x5c\x09\x2e\x21\ -\x2c\x06\x55\x44\xec\xc8\x24\x19\xd8\xe8\x84\x86\xc1\x07\xf6\x23\ -\xe0\xd7\xfc\x1c\x4f\xf0\x9f\xf6\xd6\xf8\x0c\x63\xf8\x23\x71\x0d\ -\xf7\xc7\x8d\x68\xc1\xa6\x68\x9f\x0f\x7c\x46\x4d\x8d\xd7\xf6\x84\ -\xec\xa9\xe6\x3b\x80\x52\x6b\x58\x01\x79\xa5\x92\x16\x27\xca\x85\ -\xb8\x56\x20\x50\x07\xd2\x3f\xb6\x4f\xed\xdf\x6b\xfb\x3a\x6b\x9a\ -\x47\x80\xfc\x1b\xe1\xfb\xaf\x89\x5f\x1b\x3c\x61\x13\x3f\x87\x7c\ -\x19\xa7\xcc\x23\x73\x10\x3b\x5a\xfe\xfa\x63\x95\xb3\xb0\x8c\x9f\ -\x9e\x79\x3a\x9f\x95\x03\xb7\x03\xc9\x3e\x14\xfe\xc4\x1f\xb5\x9f\ -\x83\x34\x8b\xdd\x62\xe3\xf6\xaa\xd3\x63\xf1\x37\x89\xb5\x3b\xad\ -\x63\x55\xd1\xe6\xf0\x34\x5a\xa6\x81\xa5\x49\x75\xb3\x75\xbd\x89\ -\x92\x74\xb9\x11\x5b\x88\xd4\x45\xba\x40\xa4\xf9\x8c\xc8\x7c\xc2\ -\x07\xb6\xfe\xc5\x9f\xb1\x56\x9b\xfb\x2a\x68\x1a\xa6\xad\xaa\x6a\ -\x52\x78\xcb\xe2\xa7\x8d\xa4\x5b\xef\x1a\x78\xce\xf6\x31\xf6\xcd\ -\x76\xeb\x1f\x71\x3f\xe7\x8d\xa4\x5f\x72\x0b\x74\xc2\x44\x80\x70\ -\x58\xb3\x37\xb7\xd0\x07\xc6\x5e\x0a\xf8\x55\xfb\x44\x7e\xc1\x1e\ -\x23\xd7\xbc\x49\x71\xe3\xad\x73\xf6\x9e\xf0\x16\xb4\xd1\xdf\xeb\ -\x5a\x6e\xa7\x04\x56\x7e\x2a\xd0\xa4\x8e\x20\x92\xc9\xa5\x47\x0a\ -\xad\xb5\xcc\x2c\x15\x58\xda\x30\x89\xc6\xcf\x91\xdd\xd8\x87\xfa\ -\x7b\xe0\x4f\xc7\xaf\x08\xfe\xd2\xff\x00\x0c\x74\xef\x18\xf8\x1f\ -\x5b\xb4\xd7\xfc\x3f\xaa\x06\xf2\xae\x20\xc8\x68\xdd\x4e\xd9\x22\ -\x95\x18\x07\x8a\x54\x60\x55\xe3\x70\x1d\x18\x10\xc0\x11\x8a\xeb\ -\xeb\xe2\xbf\xdb\x0b\xc0\x3a\x9f\xfc\x13\xc7\xe2\x86\xab\xfb\x4c\ -\x7c\x37\xb2\xba\x9f\xc1\xf7\x8e\xb3\xfc\x63\xf0\x75\x92\x6e\x8b\ -\x55\xb2\x5c\x2b\xf8\x82\xd2\x21\xc2\xea\x16\xa9\xf3\xca\x17\x1f\ -\x69\x81\x18\x37\xce\x88\xc4\x03\xec\x6d\x53\xc3\x5a\x6e\xb8\xec\ -\xd7\xda\x7d\x8d\xe3\x34\x0f\x6a\x4c\xf0\x2c\x84\xc4\xfb\x4b\xc7\ -\xc8\x3f\x23\x6d\x5c\xaf\x43\xb4\x67\xa0\xaf\x89\xff\x00\xe0\xe2\ -\x2d\x7b\x4d\xf8\x41\xff\x00\x04\x44\xf8\xe5\x1d\xad\xbd\xae\x9d\ -\x6b\x3e\x91\x6f\xa5\xdb\xdb\xc1\x12\xc5\x1a\xb5\xcd\xfd\xbc\x58\ -\x55\x50\x00\xcf\x98\xc7\x8f\x7a\xfb\x5f\xc2\xbe\x29\xd3\xbc\x73\ -\xe1\x7d\x37\x5a\xd1\xef\x2d\xf5\x2d\x27\x58\xb5\x8a\xf6\xca\xee\ -\x07\xdf\x15\xd4\x12\x20\x78\xe4\x46\xee\xac\xac\x08\x3d\xc1\xaf\ -\xc9\xef\xf8\x3b\xfb\xe3\xee\x97\x61\xff\x00\x04\xfd\xd0\x7e\x12\ -\xe9\xba\x95\xad\xe7\x8c\xfe\x20\x78\xc3\x4b\x8c\x68\x96\xf2\xac\ -\x97\xcf\x68\x9e\x7c\xa2\x4f\x24\x1d\xfb\x5a\x68\xa2\x55\x38\xc1\ -\x6e\x07\x34\x01\xfc\xba\x30\xda\x68\x55\xdd\x9f\x61\x9a\xbb\xe2\ -\x4d\x3a\x4d\x1f\x5a\xb8\xb3\x9a\x36\x86\x7b\x57\x68\x65\x8d\xbe\ -\xf4\x6e\xa4\xab\x29\xf7\x04\x11\x56\x3c\x2f\xe0\xdb\xcf\x16\xcd\ -\x75\x15\xa7\x93\xbe\xde\x23\x21\x12\x48\x13\x79\x1d\x11\x73\xd5\ -\xce\x0e\x14\x72\x48\xc0\xe7\x02\x80\x13\xc0\xba\x1d\xd7\x89\xfc\ -\x6d\xa3\xe9\xb6\x36\xf2\x5e\x5f\x6a\x17\xb0\xdb\x5b\xdb\xa2\xee\ -\x69\xe4\x77\x0a\x88\x07\x72\xcc\x40\xfc\x6b\xfb\x98\xfd\x8b\x3e\ -\x01\xa7\xec\xb9\xfb\x26\xfc\x3d\xf8\x7e\x36\x99\xbc\x2f\xa2\x5b\ -\xda\x5d\xba\xf4\x96\xeb\x6e\xeb\x89\x3f\xe0\x53\x34\x8d\xff\x00\ -\x02\xaf\xe5\xe3\xfe\x08\x93\xff\x00\x04\xee\xf1\x17\x87\xff\x00\ -\xe0\xbe\x5f\x0d\x7e\x1b\xfc\x42\xd0\x66\xd3\x75\x2f\x87\xb7\x2d\ -\xe2\x7d\x5a\xc6\xe9\x39\x85\xed\x6c\xbe\xd7\x06\x47\x71\xe7\xb5\ -\xbf\xb5\x7f\x5a\xd4\x00\x51\x45\x14\x00\x51\x45\x14\x01\xf2\x07\ -\xfc\x14\xa3\xfe\x09\x07\xe0\xbf\xf8\x28\x4f\x8e\x3c\x27\xe3\x0b\ -\xa9\x21\xd2\xfc\x5d\xe1\xdb\x79\x74\x3b\xc9\xe5\x8b\xcd\xb7\xd6\ -\xf4\x3b\x9c\xad\xd5\x8c\xe8\x30\x72\x15\xdd\xe1\x90\x10\x63\x93\ -\x9e\x87\x8f\xcd\x8f\xf8\x20\xbf\xec\x79\xe0\x9f\xf8\x24\x07\xfc\ -\x14\x97\xe2\xc6\x87\xf1\xc3\xc4\xd3\x78\x37\xc7\x92\x33\x78\x63\ -\xc0\x57\x3a\xd5\xa7\xd8\x74\x3f\x15\xe9\x8e\xeb\x37\xda\xed\xaf\ -\xe4\x1e\x53\xdd\x48\x12\x20\x60\x0e\xac\xbf\x30\xc3\x92\x42\x7e\ -\xf3\x57\xc8\x5f\xf0\x5c\xed\x02\x1f\x19\xff\x00\xc1\x39\xfc\x4f\ -\xe1\xd9\x74\x3d\x3f\x58\xff\x00\x84\xb7\x56\xd1\xfc\x3a\x67\xbe\ -\xb1\x4b\xa8\x74\x48\xef\xb5\x1b\x7b\x59\xb5\x03\xbd\x48\x8b\xc8\ -\x86\x59\x5c\x4b\xc7\x96\x40\x6c\x8c\x66\x80\x3e\xbb\x8e\x45\x9a\ -\x35\x65\x65\x65\x61\x90\x41\xc8\x22\x9d\x5c\xef\xc2\x6b\xaf\x0c\ -\x4d\xf0\xe7\x48\x83\xc1\xb7\x9a\x4d\xf7\x86\x74\xdb\x64\xd3\xf4\ -\xf7\xd3\x2e\x52\xe2\xd6\x38\xa0\x1e\x50\x8d\x1d\x09\x5f\x93\x66\ -\xdc\x03\xc1\x5c\x57\x45\x40\x05\x56\xd6\x34\x8b\x5f\x10\x69\x17\ -\x5a\x7d\xf4\x11\xdd\x59\xdf\x42\xf6\xf3\xc3\x22\xee\x49\x63\x75\ -\x2a\xca\xc0\xf5\x04\x12\x08\xf7\xab\x35\xf9\x1f\xff\x00\x07\x3a\ -\xfe\xdf\xbe\x32\xfd\x89\x6e\x7c\x0f\xa7\xe8\xfe\x32\xf1\xff\x00\ -\x87\x34\x3f\x1e\xe8\x5a\x85\xaa\xa7\x85\xef\x21\xd3\x5e\xdb\x50\ -\x82\xea\xcc\xa4\xf3\x5d\x18\x24\x95\x63\x68\x26\x99\x36\xc6\x54\ -\xe4\x2b\x73\x82\x08\x07\x3b\xfb\x01\x2f\xc6\x4b\x5f\xda\x0a\x1f\ -\xd8\xf4\xfc\x66\xf1\x86\x9b\xe1\x3f\x84\xba\x87\x89\x74\x7d\x46\ -\x1f\x0e\xe9\xf6\x36\x7a\xd6\x99\xa1\x59\x8b\x19\x74\x3b\x96\xbd\ -\x96\x39\x64\x54\xb9\x8e\xfc\xc2\x36\xaa\x90\x6d\xf0\xad\x85\x26\ -\xbc\x0f\xe2\x64\x3f\x0b\x7f\x65\x7f\xf8\x28\x47\xc7\x1f\x10\x7c\ -\x4c\x97\xce\xf8\x95\xfb\x33\x78\x72\x3b\xaf\x87\xfa\x25\xf4\x93\ -\xea\xba\xa7\xc4\x5d\x5e\xfd\x47\xd9\x75\xdb\xbb\x89\x9e\x57\x9a\ -\x78\xbc\xeb\x45\x16\xca\x76\xc5\x82\xe8\xaa\xaa\x45\x74\x1f\xf0\ -\x4d\x6f\xf8\x28\x17\x83\x7f\x63\x3f\xd9\xdb\x51\xd0\xff\x00\x65\ -\x3f\x82\xdf\x16\xbf\x69\xef\x8f\x5e\x3f\x75\xbf\xf1\x67\x8b\xce\ -\x87\x79\x6f\xa2\x4d\x7d\x83\xb5\x5e\xf2\xe3\x33\x9b\x58\x0b\xb0\ -\x40\xe1\x0b\xfc\xce\xce\x8c\xe7\x17\xbf\x64\x5f\xf8\x37\x47\xf6\ -\x9c\xf8\xf9\xfb\x52\xf8\x93\xf6\x9a\xf8\xff\x00\xf1\x2b\x4f\xf8\ -\x77\xf1\x63\x53\x9e\x6d\x7b\x41\xb4\xd1\x4a\x5f\x5c\xe9\xda\xbe\ -\xc1\xf6\x39\x27\x2a\x4c\x11\xdb\x40\x56\x34\xf2\x11\xa5\x2f\x1a\ -\x6c\x2c\xbc\xe4\x03\xf3\xb7\xe0\x27\xfc\x11\x7f\xe2\x89\xfd\xa8\ -\xfc\x1f\xe0\xad\x6f\xc3\x70\xeb\xdf\x17\xbc\x51\x69\x1f\x89\x21\ -\xf0\x8d\xd8\x97\xca\xd0\xad\x26\x67\xf2\xaf\xf5\xc9\x02\xec\xb6\ -\xb7\x42\x04\xaf\x0e\xe6\x96\x43\xb2\x10\xa1\x9d\xb1\xfb\x19\xfb\ -\x1a\xff\x00\xc1\xa7\xbf\x0b\xff\x00\x67\x76\xf8\x5b\xe2\x6f\x12\ -\x78\xa6\xfb\xc4\x9f\x10\x3c\x17\xe2\x2b\x1f\x12\xeb\x13\x0b\x48\ -\xdb\x4b\xd4\xa4\xb7\xf3\x9c\xda\x45\x11\x0a\x52\x26\x9e\x48\x1c\ -\xbb\xef\x62\x2d\x55\x40\x50\xc6\xbe\xc9\xff\x00\x82\x61\x7c\x4f\ -\xf0\xf7\xc6\xef\x87\xfe\x2e\xf1\x35\xc7\x85\x2c\xbc\x23\xf1\x9a\ -\x2d\x72\x4d\x13\xe2\x9d\x87\x98\xd3\xdd\x5b\xeb\x76\x8a\xa8\xca\ -\x24\x72\x5d\xad\x1a\x32\x92\xdb\x00\x76\x08\x66\x5d\xa0\x12\xd5\ -\xf4\xed\x00\x78\x3e\xb3\xff\x00\x04\xe5\xf8\x6b\xab\xfe\xdf\x9a\ -\x37\xed\x28\xb6\xba\xad\x8f\xc4\xdd\x23\x44\x97\x40\x79\xad\x6e\ -\xfc\xbb\x3d\x4a\xd9\xd1\x90\x1b\x88\xb6\x9f\x31\xd1\x5b\x0a\x77\ -\x0c\x6d\x5c\x83\xb5\x71\xe9\x5f\x18\x3e\x3e\xf8\x17\xf6\x7b\xd0\ -\x23\xd5\x7c\x7b\xe3\x2f\x0a\xf8\x2b\x4c\x99\x8a\x47\x75\xae\xea\ -\xb0\x69\xf0\xca\xc3\xaa\xab\x4a\xca\x18\xf2\x38\x1c\xf3\x5a\x9f\ -\x11\xfc\x7d\xa6\xfc\x2a\xf8\x7b\xaf\x78\xa3\x5a\x9b\xec\xda\x3f\ -\x86\xf4\xeb\x8d\x52\xfa\x6c\x7f\xaa\x82\x08\xda\x59\x1b\xf0\x55\ -\x26\xbf\x89\xdf\xf8\x29\x5f\xfc\x14\x4b\xc7\x1f\xf0\x53\x0f\xda\ -\xab\xc4\x1f\x12\x3c\x65\x7d\x70\xd6\xf7\x53\xc9\x06\x87\xa4\x97\ -\xdd\x6d\xa0\xe9\xe1\x8f\x95\x6d\x12\xf4\x18\x5c\x17\x61\xcb\xb9\ -\x66\x3c\x9a\x00\xfe\xd7\x7e\x19\xfc\x56\xf0\xbf\xc6\x8f\x09\x41\ -\xaf\xf8\x3f\xc4\x9a\x0f\x8a\xb4\x3b\xa2\x56\x1d\x47\x47\xbf\x8a\ -\xfa\xd6\x52\x3a\x81\x24\x4c\xca\x48\xc8\xc8\xcf\x14\x57\xf3\xa9\ -\xff\x00\x06\x4f\x6a\x1f\x10\x8f\xed\x77\xf1\x52\xd7\x4f\x93\x52\ -\x6f\x85\xeb\xe1\x75\x97\x5a\x8c\xbb\x7d\x8a\x3d\x50\xdc\xc4\x2c\ -\xdb\x1d\x3c\xe3\x12\xdd\x80\x47\x25\x03\x67\xa0\xa2\x80\x3f\xa4\ -\xaa\x28\xa2\x80\x0a\xf9\x17\xf6\x9f\xf8\xa7\xe1\xbf\x10\xff\x00\ -\xc1\x43\x3c\x2d\xf0\xb7\xe2\x86\xa9\xa4\x69\x7f\x0d\x57\xc0\x97\ -\x3e\x30\xb5\xb3\xd5\xae\x52\xdb\x4e\xf1\x1e\xa5\x15\xfa\x41\x24\ -\x57\x0d\x23\x04\x99\x6d\xa1\x64\x94\x40\xd9\x52\x67\xde\xc0\xf9\ -\x63\x05\x14\x00\xdf\xf8\x26\x86\xa5\xe0\xbd\x33\xf6\x80\xfd\xa7\ -\xbc\x3b\xe0\xfd\x4a\xc6\xf2\x2b\x7f\x1a\xd8\xeb\xad\x0e\x8c\x22\ -\x1a\x1d\xad\xbd\xf6\x93\x68\xd6\xe2\xd8\x44\x4a\x09\x58\x43\x23\ -\x4d\x8c\x16\x76\x57\x20\x6f\x15\xf5\xe5\x14\x50\x07\x01\xfb\x55\ -\xfc\x6d\x87\xf6\x6c\xfd\x9a\x3c\x7b\xf1\x02\x68\x5a\xe2\x3f\x06\ -\xe8\x37\x9a\xbf\x94\xab\x9f\x30\xc3\x0b\x3a\x83\xe8\x09\x03\x27\ -\xb0\xc9\xed\x5f\x9b\xdf\x1d\xbf\xe0\x84\xbf\x0f\xfc\x4d\xff\x00\ -\x04\xbf\xd6\x3c\x59\xe2\x9b\x7d\x3f\xe2\x07\xed\x01\x6f\xa3\x47\ -\xe3\xad\x53\xc6\x5a\x8e\xa9\x7b\xab\x41\xe2\x0d\x4e\xda\x3f\xb5\ -\xc9\x07\xcd\x27\x36\x13\x05\x78\x84\x51\x85\x5d\x8e\xa4\x0c\xa8\ -\x34\x51\x40\x1b\x9f\x02\x3f\xe0\xe5\x6f\x80\x7a\x4e\x81\xa3\xea\ -\xfe\x32\xb0\xf1\x47\xc1\x4f\x86\x3a\x96\x83\x6c\xbe\x0b\x8f\x50\ -\xf0\x7d\xda\xda\xeb\x8d\x11\xf2\xee\xda\xd6\x5b\x68\xde\x2f\x26\ -\xde\x41\xe4\x22\x2e\x09\x11\xbb\x1c\x02\x82\xba\xdf\x8d\xbf\xf0\ -\x75\x2f\xec\x65\xf0\x93\xc1\xd2\xea\x3a\x5f\xc4\x4d\x4b\xc7\x9a\ -\x87\x94\x64\x83\x4a\xd0\x74\x2b\xc3\x71\x33\x63\x85\x2f\x71\x1c\ -\x51\x26\x4f\xf7\x9c\x63\xde\x8a\x28\x03\xe1\xaf\xf8\x24\xb7\xfc\ -\x15\x03\xe2\xe7\xc6\x5f\xf8\x29\x27\x8c\x7f\x6a\x4f\x14\x78\x6d\ -\x7c\x33\xf0\x07\xe3\x77\x8b\x34\xdf\x85\xd7\x51\x22\x15\x83\x4e\ -\xbc\x30\xc8\x34\x99\xcc\x98\x02\x67\x89\x92\x3b\x79\xa6\x38\x1b\ -\xaf\xd4\x60\x00\xaa\xbf\xbf\x94\x51\x40\x1f\x2f\x7f\xc1\x6b\xf5\ -\x2b\xcd\x27\xfe\x09\x23\xfb\x45\x4d\x63\xe6\x0b\x81\xe0\x3d\x51\ -\x33\x1f\xde\x08\xd0\x32\xb9\xfc\x10\xb7\xe1\x5f\xc5\x34\x60\x06\ -\x56\x65\x2c\x99\x19\xf7\xa2\x8a\x00\xfe\xc0\xff\x00\xe0\xda\x2f\ -\xd9\x7f\x4e\xfd\x99\xff\x00\xe0\x8f\xdf\x0b\x64\x87\x4f\x8a\xd3\ -\x59\xf1\xfd\xb4\x9e\x2e\xd5\xe7\x09\x89\x2e\xe4\xbb\x72\xd0\x33\ -\x1e\xa7\x6d\xa8\xb7\x41\xec\xbe\xe6\x8a\x28\xa0\x0f\xff\xd9\ -" - -qt_resource_name = b"\ -\x00\x06\ -\x07\x03\x7d\xc3\ -\x00\x69\ -\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\ -\x00\x08\ -\x0b\x77\x5c\xa7\ -\x00\x68\ -\x00\x65\x00\x61\x00\x64\x00\x2e\x00\x6a\x00\x70\x00\x67\ -" - -qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x60\x83\x46\x10\xc7\ -" - -qt_version = QtCore.qVersion().split('.') -if qt_version < ['5', '8', '0']: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() diff --git a/图片/图片加载/xpmres.py b/图片/图片加载/xpmres.py deleted file mode 100644 index dc69078..0000000 --- a/图片/图片加载/xpmres.py +++ /dev/null @@ -1,399 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -''' -Created on 2017年12月23日 -@author: Irony."[讽刺] -@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447 -@email: 892768447@qq.com -@file: xpmres -@description: -''' - -__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com" -__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]" -__Version__ = "Version 1.0" - -# 这里把转换的xpm数组直接放到py文件中当做一个变量 - -# 这里需要把xpm文件里的内容做下修改成python的list -image_head = [ - "120 120 256 2", - "8 c Black", - "u. c #CACACA", - " . c #0F0F0F", - "I c #D9D9D9", - "x. c #1E1E1E", - "@X c #E8E8E8", - "%. c #2D2D2D", - "l c #F7F7F7", - "S c #3C3C3C", - "1. c #4B4B4B", - "XX c #5A5A5A", - "{ c #696969", - "U. c #787878", - "7 c #878787", - "wX c #969696", - "JX c #A5A5A5", - "SX c #B4B4B4", - "p. c #C3C3C3", - "| c #080808", - "9 c #D2D2D2", - "r. c #171717", - "2 c #E1E1E1", - "<. c #262626", - "0 c #F0F0F0", - "3. c #353535", - " c #FFFFFF", - "0X c #444444", - "OX c #535353", - "PX c #626262", - "/ c #717171", - "$X c #808080", - "7X c #8F8F8F", - "] c #9E9E9E", - "-X c #ADADAD", - "c c #BCBCBC", - "O. c #010101", - "B c #CBCBCB", - "b c #101010", - "@ c #DADADA", - ";. c #1F1F1F", - "dX c #E9E9E9", - "F c #2E2E2E", - "j c #F8F8F8", - "C. c #3D3D3D", - "N. c #4C4C4C", - "J c #5B5B5B", - "G. c #6A6A6A", - "HX c #797979", - "FX c #888888", - "/. c #979797", - "m. c #A6A6A6", - "uX c #B5B5B5", - "$. c #C4C4C4", - "t. c #090909", - ":. c #D3D3D3", - "a. c #181818", - "$ c #E2E2E2", - "#X c #272727", - "F. c #F1F1F1", - "VX c #363636", - "Q c #454545", - "K. c #545454", - "gX c #636363", - "C c #727272", - " X c #818181", - "KX c #909090", - "P c #9F9F9F", - "e c #AEAEAE", - "yX c #BDBDBD", - "5. c #020202", - "p c #CCCCCC", - "i c #111111", - "+X c #DBDBDB", - "J. c #202020", - "T c #EAEAEA", - "b. c #2F2F2F", - "r c #F9F9F9", - "6. c #3E3E3E", - "g. c #4D4D4D", - "v. c #5C5C5C", - ",. c #6B6B6B", - "; c #7A7A7A", - "&X c #898989", - "D. c #989898", - "t c #A7A7A7", - "k. c #B6B6B6", - "w. c #C5C5C5", - ".. c #0A0A0A", - "c. c #D4D4D4", - ";X c #191919", - "6 c #E3E3E3", - "sX c #282828", - "{. c #F2F2F2", - "iX c #373737", - "-. c #464646", - "l. c #555555", - "~ c #646464", - "P. c #737373", - "a c #828282", - "*X c #919191", - "CX c #A0A0A0", - "BX c #AFAFAF", - "6X c #BEBEBE", - "w c #030303", - "s c #CDCDCD", - "R. c #121212", - "]. c #DCDCDC", - "q. c #212121", - "x c #EBEBEB", - "D c #303030", - "o c #FAFAFA", - "f. c #3F3F3F", - ".X c #4E4E4E", - "4 c #5D5D5D", - "K c #6C6C6C", - "GX c #7B7B7B", - "jX c #8A8A8A", - "rX c #999999", - "8. c #A8A8A8", - "mX c #B7B7B7", - "4X c #C6C6C6", - "y. c #0B0B0B", - "|. c #D5D5D5", - "4. c #1A1A1A", - "B. c #E4E4E4", - "ZX c #292929", - ", c #F3F3F3", - "1X c #383838", - "A c #474747", - "^ c #565656", - ": c #656565", - "[ c #747474", - "W. c #838383", - "n. c #929292", - "V. c #A1A1A1", - "[. c #B0B0B0", - "tX c #BFBFBF", - "X. c #040404", - "IX c #CECECE", - "H. c #131313", - "U c #DDDDDD", - "`. c #222222", - ">X c #ECECEC", - "G c #313131", - "+ c #FBFBFB", - "xX c #404040", - "T. c #4F4F4F", - "lX c #5E5E5E", - "E. c #6D6D6D", - "z c #7C7C7C", - "!. c #8B8B8B", - "i. c #9A9A9A", - "oX c #A9A9A9", - "zX c #B8B8B8", - "%X c #C7C7C7", - "v c #0C0C0C", - "*. c #D6D6D6", - "z. c #1B1B1B", - "= c #E5E5E5", - "R c #2A2A2A", - "k c #F4F4F4", - "H c #393939", - "_. c #484848", - "L. c #575757", - "d. c #666666", - "MX c #757575", - "Z. c #848484", - "LX c #939393", - "y c #A2A2A2", - "NX c #B1B1B1", - "UX c #C0C0C0", - "o. c #050505", - "'. c #CFCFCF", - "5X c #141414", - "h. c #DEDEDE", - ",X c #232323", - ") c #EDEDED", - "I. c #323232", - "O c #FCFCFC", - "3X c #414141", - "Q. c #505050", - "2. c #5F5F5F", - "bX c #6E6E6E", - "qX c #7D7D7D", - "# c #8C8C8C", - "V c #9B9B9B", - "9X c #AAAAAA", - "fX c #B9B9B9", - "(. c #C8C8C8", - "3 c #0D0D0D", - "h c #D7D7D7", - "@. c #1C1C1C", - "_ c #E6E6E6", - "M. c #2B2B2B", - "j. c #F5F5F5", - "A. c #3A3A3A", - ":X c #494949", - "Z c #585858", - "8X c #676767", - "d c #767676", - "hX c #858585", - "AX c #949494", - "=. c #A3A3A3", - "0. c #B2B2B2", - "#. c #C1C1C1", - "+. c #060606", - "N c #D0D0D0", - "u c #151515", - "cX c #DFDFDF", - "Y. c #242424", - "s. c #EEEEEE", - "q c #333333", - ". c #FDFDFD", - "> c #424242", - ". c #C9C9C9", - "} c #0E0E0E", - "aX c #D8D8D8", - "E c #1D1D1D", - "( c #E7E7E7", - "}. c #2C2C2C", - "! c #F6F6F6", - "n c #3B3B3B", - "&. c #4A4A4A", - "~. c #595959", - "=X c #686868", - "& c #777777", - "L c #868686", - "< c #959595", - "7. c #A4A4A4", - "). c #B3B3B3", - "` c #C2C2C2", - "W c #070707", - "- c #D1D1D1", - "eX c #161616", - "g c #E0E0E0", - "f c #252525", - "5 c #EFEFEF", - "m c #343434", - "X c #FEFEFE", - "2X c #434343", - "nX c #525252", - "* c #616161", - "kX c #707070", - "% c #7F7F7F", - "M c #8E8E8E", - "vX c #9D9D9D", - "9. c #ACACAC", - "' c #BBBBBB", - - " . . X . X X X X o ", - " . X O + O . + ", - " . X @ # $ X ", - " X o O % & * = ", - " . X . X - ; . : > , O X ", - " . . < 1 2 3 4 ", - " X 5 ; 6 7 8 % + ", - " X . X 9 % X O 0 q w e O ", - " r X o X . X X . . . X O X X X . X X X X X O O . t y X X X 9 u i p X . O ", - "+ X X + . . X X X X . X X + . O . X . O X . . . X X X X X . r . . a s . + d 8 f g O X ", - " X h r o X + . X X X . . X X X X . X . o j 0 5 0 k j + . X O X X . X l z x X . c v b n x . X ", - " X . X y 8 m M N . . . . . + O X . X O . X 5 B V C Z A S m D F G H A J K L P c I k X X X U Y . X X X T R E W Q ! X O ", - " O O r Q ~ Y m F ^ / 1 ( X . X X O . X + . = ) _ ` ' ] [ { C S } | .v W ..X.w X.o.O.8 8 X.O.+.3 @.m ^ # #.r O . . $.V . . J O.%...J + . + ", - ". . + . &.% X . *.=.-.;.Q a :.+ O o O o X >.,.<.1.2.3.v E 4.8 o.+.| | X.8 8 8 O.8 8 8 5.w O.8 8 5.8 O...i 3 ..i 6.] o X 1 7. O X X 8.w b ;.8 9. . ", - " . O . 0.q.w. j e.D u f K B O o X o X ` 2.r.W O.5.8 8 | 3 t.w 8 O.O.8 8 8 5.O.8 X.O.8 8 8 8 8 8 8 8 8 8 8 X.y.b o.8 &.u. i.p. X X 6 a.5.5.O.<.s. + ", - "X X O d.-.l . f.5.8 5.b g.P p h.j. k.l.} 8 O.w 8 8 w 8 8 5.5.8 5.O.8 8 O.O.8 8 8 8 8 O.O.8 8 8 8 w 8 8 O.O.8 O.8 O.z.4.x.d a c.X X X . X ^ 8 5.8 5.v.. X ", - "X X O O c.x.B . 8.+.O.8 w 8 5.b.[ n.m.:. X ' l. .8 +.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 | @.M.H N.B.X X . . < 8 8 O.8 O.V. + X . ", - " X . k C.# . O Z.w 8 O.8 5.5...A.: S.D.F.o - G.;.H.8 X.X.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 o.8 5.W J.K.j. O O c.b 8 5.8 8 ;.s. + + O ", - " X . L.S.X j P.o.O.8 8 O.8 8 +.@.u l.z H R 3.W O.5.8 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.O.8 8 { o . X O + j.I.8 O.8 8 w z . + X X X ", - ". . U.&. + r + d 5.O.5.O.O.5.O.8 8 5.Y.T.l.R.5.8 O.8 5.O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 X.8 8 8 5.E.O X . v.O.w O.8 8 H.I . X O ", - " X X X X 7 6.O + X X W.+.8 8 +.8 O.8 O.X.z.f 8 5.8 8 w O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 Q.O O + X !.8 8 8 5.8 5.~.. o + . ", - " + X . ^.I., O + /.J.5.8 5.8 w 8 O.5.8 8 8 o.8 8 8 8 O.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 X.8 5.8 3.( X o X . X 8.o.O.o.8 w O.o.(. + ", - " O X O c ;.U O X X X ).m 5.w 8 8 8 w 8 5.w 8 8 8 8 5.O.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.t.V O X X B z.8 5.X.8 8 O._.X X X . ", - " O X X - `.(.X + X X O . I b.8 O.8 w 8 O.8 8 O.8 X.O.8 5.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 O.8 O.A.h '. O . . . X ].F +.8 8 O.w 8 5.[. X . ", - " {.}.i.. . X . X |.<.W 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.5.8 8 .. X.XN ].+ X k ,...O.o.8 w 8 8 R T O X ", - " XXZ o . O 0 * .8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 O.> d.G.oXOX+X . O . @X#X5.5.W 8 w O.8 V . . . ", - " 7.E 2 . . X X 7 b w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 O.8 8 8 y.}...I.Q.+X8.$X%X&X].!.8 ..8 8 5.8 w *X . ", - " X ) <.L X c ;.8 5.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.5.8 w 8 O.8 w ..Y.=XF : -Xd./.I.;XX.8 w O.z.:Xt O X . ", - " . *XJ.2 X O r >X1.8 O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 O.8 O.O.8 5.O.5.5.@.A ~.Z 1 { XX,X .8 8 5.8 3. .Xs.. . ", - " X . 4Xz.[.. r h.Y.8 X.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 w 8 8 8 X.X.w 8 O.8 O.8 .8 ;X3Xi y.1XJ.3 i ;Xx.S. ", - " . X i.}.h C X.O.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.8 8 5.8 8 8 5.8 O.O.8 8 8 5.O.8 w 8 u H x...5X5X6X ", - " O + W.N.s.9 z.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.W r. .| w > j . . X X ", - " X X . 7X& 8X5.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 +.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 5.X.W +.9X O . X ", - " X O O oXi 8 8 w 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 5.8 8 | 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 8 W X.8 0Xk X O . . ", - " + . . qX8 w 8 O.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 w 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.w 8 o.8 3 +.' . O ", - " + . . I ,XO.5.8 8 5.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 5.5.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.O.: X O X ", - " + . X X % 5.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 w 8 +.E $ X X X ", - " . x m 8 O.8 O.O.8 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 8 X.5.O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 o.8 5.wXX . X ", - " . X oX+.8 O.8 8 w 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 8 5.w K b 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.8 X.o.&.. X ", - " X * 8 O.8 8 8 8 8 8 8 8 8 5.8 8 8 O.8 O.r.5X8 8 5.8 w 8 8 8 8 8 8 8 8 8 w 8 8 8 O. .(.G.8 O.8 8 5.5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5...eXc. X ", - " . . 0 n 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 5.f a z.5.8 8 8 8 w 8 8 8 8 8 8 8 8 8 O.w 8 8 ..B c.;.8 O.8 8 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.t.W rXX O X ", - " 4XY.8 5.8 8 8 8 8 8 8 8 8 5.o.8 w 8 a.tXM o.8 O.8 X.8 8 8 8 8 8 8 8 8 8 8 O.8 O.5.i yX W.W 8 w o.8 O.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.t.o.^ X X ", - " . L ;X8 O.8 8 8 8 8 8 8 8 8 O.8 w 8 b uX ~.8 O.8 8 8 O.8 8 8 8 8 8 8 8 8 5.O.8 8 8 R.c ) 0XO.8 8 +.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.W b <.T X ", - " + k _.X.8 8 8 8 8 8 8 8 8 8 w 8 w 8 v wX F.iXo.8 8 5.8 O.O.8 8 8 8 8 8 8 8 8 8 O.8 8 a.:. r 4XE 8 W 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.w u W pX O ", - " X aX;.8 O.8 8 8 8 8 8 8 8 8 O.8 8 W ~ . O 6 ;.8 8 O.5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 +.`.6 X M b 8 8 8 w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.u 5. X . ", - " o P y.5.O.O.8 8 8 8 8 8 8 8 8 X.8 G ].O w.b 8 w 8 8 8 5.8 8 8 8 8 8 8 8 8 O.w 8 8 8 b.s. X _ uXsX8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.R.3 1.+ X ", - " . d.X.8 8 8 8 8 8 8 8 8 8 8 5.8 3 rX X O 9XX.8 5.8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.w .XX . U qX,.XX;X8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.} H.J.dXX ", - " @XA.X.8 O.8 w 8 8 O.O.8 8 8 O.w A dXk.L ( D.8 O.8 8 O.O.8 8 8 8 8 8 8 8 8 8 8 5.O.8 X.d. 5 k X pXz.8 8 8 O.8 8 O.O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 v 4.3 ` . ", - " X + ' #XO.8 O.8 8 8 5.8 8 O.8 X.8 u fX6XgXhX5 W.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 O.y.jX O + o O D.3 8 8 8 8 5.8 O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 t.4.o.D.X ", - " . jX;XO.8 O.8 8 8 8 8 8 5.8 8 o.T.k j + + hXO.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w b k. O kX| 8 O.O.5.X.8 5.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.@.t.K ", - " k lXi O.8 O.8 O.8 8 O.8 8 O.8 5XzX . P.w 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 O.w w J.h.X X X O . l XXt.8 O.8 8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ;Xi T.X . ", - " O s %.o.8 8 8 O.8 8 8 O.8 8 +.w A r X O C +.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.5.-.o X X X X F.> 8 O.5.w 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 i .iXF.X ", - " i.y.8 w 8 8 8 8 O.8 8 5.8 8 v 8.O . kX..O.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 O.8 w & X . . , c.).m.B.$ 6.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.3 3 sX$ ", - " l { 5.8 w O.8 8 8 O.8 8 w 8 8 xXF.X + 7 } O.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 O.i uX+ + cXV.a L V L 4Xo aXA.+.8 8 O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.3 i J.*. . ", - " h.Q w 5.8 8 5.8 8 O.8 8 8 O.t.!. j j.s. X X 1 b 5.8 O.8 8 5.8 8 8 8 8 8 8 8 8 O.8 w Y.x ) P Z.[.pXvXbXlX&.> nXA.v o.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 3 u 4.p ", - ". X X X mX1X5.8 8 O.8 8 8 8 5.8 8 X.q.9.oXjXMX{ y . tXz.8 8 w 8 8 8 5.8 8 8 8 8 8 8 8 8 8 O.: O 6 ^.e 7.* %.y.z.u w O.8 x.sXw 8 5.8 8 8 8 5.8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 y.x. .>. X ", - " . X X rXm 8 O.O.8 8 O.5.O.8 5.o.5.Q.- cXcXN NXmX= l s J.X.8 8 8 O.8 O.8 8 8 8 8 8 8 8 8 w o.).. . B.BX^ D L.b.R ;Xw 8 8 w w sX}.v 8 O.O.8 8 8 o.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 X.`.3 w. ", - " . X X 0 L VX8 5.5.8 O.8 8 8 5.5.8 i CXc.% .g.eX*X+ . + . X . X O O O O X . A 8 O.O.8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 O.w 8 8 ..i 7 X ", - " O X ! p 1X| 8 ;X0 X O X . O O C w ~ T O O O X . O IXA ~.B.. . X . X X + + X O . r F O.O.O.O.8 8 8 8 8 8 8 8 8 8 5.5.8 8 8 O.8 8 8 o.5XB . X X X ", - " + X X O X & O.8 8 BX . X O 0 L.+.L + X X . + . X T ^ }.p X O . . O O . X + X dXr.8 O.O.O.8 8 8 8 8 8 O.8 8 8 5.5.8 8 8 8 8 5.O.8 2Xj.O X X ", - " + . . $.8 X.8 -.+ . _ xXy.e X X X X . X O X + {.~ r.NX O X . X . . :.| O.O.O.O.8 8 8 8 8 8 O.8 8 8 w 5.8 8 O.8 8 8 8 5.&X . X X ", - " B.eX8 8 8 oX O . O X . X cXVX4.yX . + ,.} e . X . . + X . X zX8 O.w +.8 8 5.8 w 8 8 w 8 O.8 w 8 5.8 O.O.8 8 5. .@ ", - " ) #XO.X.w 8XO X = q Y.@ . + + { +.). . o O O O . X < X.8 5.X.X.O.8 8 5.8 5.8 8 8 w 5.o.8 5.8 8 w O.8 2XO ", - " X 1XO.o.5...[.X O + . X + x f.#X2 O X X + J y.pX X . o [ 8 o.| o.o.5.8 O.8 8 8 +.8 5.8 8 8 O.8 W w 8 8 O.e. ", - " X hX8 .H.8 y.BX o j Q.J.].+ O l . . ! _.E @ O X + X :X8 W v t.5.O.8 8 8 O.8 8 5.8 8 X.X.8 5.} w 8 5.X.w.+ ", - " X pX| o.b 5.o.X.*X. O + GX} zX O O ( ZX3.r + X . X . X j D 8 b +.y.w 8 O.8 8 8 5.8 8 O.8 X.8 8 W @.X.5.8 5X>X ", - " _ f 8 ,X+.5.5.8 &.pXo 5 ,X=. X X . . O . + >.o./ . X X X I i 8 y.| | W 8 8 8 5.8 O.O.w 8 8 Y.a.| }.C.O.O.8 S X X ", - " X L.8 Y.q.8 3 X.8 8 > 9X/.C O + . O O L w p.X . O X X X {.9.8 W 4.#X5.+.8 8 8 O.8 8 o.8 8 b M.Q.v < $X| o.X.=X. ", - " . X t w W 3Xt.8 +.w 5.8 8 b pX . X X X O 0 sX_.. . X X g L.m 8 5.U.N.8 w 8 8 8 8 O.| 8 w 8 4.r.R.b.l '.,X+.8 jX X ", - " O >Xb.5.T.=XO.W 5.X.O. .c X . X X AX+.>.X O ) -Xm G @.O.VXh.m 5.w 8 8 O.8 5X .8 w H.t.W 8 JX 8X8 O.Z.. O X X O X . ", - " X ^.o.sX8.b.8 y.W 8 b.( X X X X O . X O U v E. = -X8XH ,XGX7 X.u pXT r.8 8 w 8 w o.kX@.5.#Xu %.3 D l . . u.4.5.-. . X . O ", - " + X O + / eXd D.O.R.v 8 f.x . X X X }.r.L [ l.I.q T.XXI , I.8 z X 9X+.8 O.8 eX5.lX; 8 ..q C.k.5.d. O vX3XFX + X . X O O O ", - " . X W.A.zXS 5.+.,X|.. X X X . X X + jX8 VXC i W.5 6XL qX+.^ r ~ w 5.5.@.r.I.# W 8 * '.dX5 _.yX. . O O . + . . O O O ", - " O X . X k 7.@X[.O.8 -X+ X X . X . X O . X 5 H.Z }.$XX ,.b -.j. +XZXeX8 ;XG 1.U.} z.,.+X . X X . O X O . . + X + O ", - " O . o r A 8 N.( X X r X . ~.q.>X`.P. {.) i.X.xX! X &XH. .m 9.7 ; y.a.|.+ . + O . o . X . O . o ", - " X X X . :.sX8 q.rXl + X + + X LXH.V.%.UX. o O >Xb.8 4 +X}.O.2X$ $.1X5.E c. . X O X r X X X + l _ {. X o ", - " X . X . X I V.A 8 }.AX5 j X . X . . X - a.i l. X A.8 v N.#XQ.) X < 8 I.+X . + . X X X X oXXXY.z.q.1.9X X X ", - " X X ! wX#X5.4 X X + X X X s.AXI.8 3 c. r B +.v ..o.{ X 6 g.nXT X . O X O . F.XX8 8 w 8 5.8 8 d.X X ", - " . O O 9 eXSX+ X X O X x aX0.G.}.t.W X.P X X . DX8 5.8 .x.4X KX% ! O X X X X r T.o.X.X.W O.8 5.8 5.a . . ", - " . X O jXq.s. X O + Z.M..X,Xu 0XH.jXo . X O /.8 8 8 5.x.0X#XB.{.O O . X X bX8 8 8 8 8 w w 8 O.8 ;X, ", - " X X r iXX+ X O X k A.D 0 . + X X _ r.O.O.8 8 O.8 8 8 w 8 w (. r ", - " . O '.XX8.o . h R.-X X X X + [ 8 i ~ vXM.8 { r o . . . + O X P.8 wX + . X s | 8 8 8 8 8 8 8 w 8 8 8XO . + X ", - " B.OX0. X ` ;.c + O X X X X + >X4.d.cX . p.sXrX j T B X X + 9 z.5.q.>X . + + k.8 8 O.8 8 8 8 5.W o.5.IX X X ", - " . . HX. O + O o X 0 ZX8 w 8 FX. X . X 9XO.8 O.O.8 8 8 5.| O.J.j.X X X ", - " . -.Z.. + + B d.+ X O O X bX3.aX O - E wX !.Y X O + O + p C.8 +.y.q.;._ O X X CXw 8 O.8 8 8 8 O.o.8 K.. X . ", - " O S DX . >X_.LXX X . . @ > - X . . J ;.Q.3 / mX5 U g ! ! @ m.Z t.O.8 8 `.=.8 AX X . X ^.8 8 8 8 8 8 8 8 O.8 a . O ", - " X =X,Xj. j K.n . . O c F {.O . . DX8 8 C.y.O.q.4.eXF f.f.#Xv 8 8 8 8 5.8 qXj.ZXG l . X X e 8 8 8 8 O.5.8 8 8 O.NXO X X O ", - " . ' 3 PX^.kXU.JXv d.O O . . . *.z.7X+ . . W.8 A.l 0.x.8 O.8 8 O.8 8 O.5.8 O.w 8 Q.+ O M 8 ' X %Xw 8 O.5.w X.O.8 O...@ X X " -] diff --git a/图片/显示.9格式图片/README.md b/图片/显示.9格式图片/README.md deleted file mode 100644 index aaebb44..0000000 --- a/图片/显示.9格式图片/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# .9格式图片显示(气泡) - -什么叫.9.PNG呢,这是安卓开发里面的一种特殊的图片 -这种格式的图片在android 环境下具有自适应调节大小的能力。 - - -(1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展。 - -(2)允许开发人员定义内容显示区,用于显示文字或其他内容 - -目前手机QQ中很多漂亮的的聊天气泡就是.9格式的png图片 - -在Github开源库中搜索到两个C++版本的 - -1.一个是NinePatchQt https://github.com/Roninsc2/NinePatchQt - -2.一个是QtNinePatch https://github.com/soramimi/QtNinePatch - -### For PyQt -1、目前针对第一个库在2年前用[纯python版本1](纯python版本1/)参考源码重新写一个见 - -2、这次针对第二个写了[纯python版本2](纯python版本2/)的和[pyd编译好的](pyd版本)两个版本 - -### 说明 -1、建议优先使用pyd版本的(后续提供Python3.4 3.5 3.6 3.7 编译好的32为库文件),也可以自行编译,编译步骤见下文。 - -2、其次可以使用纯python版本2的(个人觉得方便调用) - -3、最后再考虑纯python版本1的吧 - -4、以上为个人意见,两个C++版本的写法不一样,但是核心算法应该是类似的。 - -### 自行编译 - -1、首先要安装好Qt、PyQt5、编译安装对应的sip、对应的VC++编译工具 - -2、用Qt Creator 打开pro文件进行编译 - -3、进入源码中的sip文件夹 - -4、修改configure.py文件 - -```python -# 这里是你的VC版本和对应的Qt目录中的文件夹 -config.platform = "win32-msvc2010" -qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010' -``` - -5、python configure.py - -![截图](ScreenShot/1.gif) diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.cpp b/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.cpp deleted file mode 100644 index 6bda869..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "QtNinePatch.h" - -struct Part { - bool stretchable; - int pos; - int len; - Part() - : stretchable(false) - , pos(0) - , len(0) - { - } - Part(int pos, int len, bool stretchable) - : stretchable(stretchable) - , pos(pos) - , len(len) - { - } -}; - -static inline bool isStretchableMarker(QRgb pixel) -{ - return (qAlpha(pixel) >> 7) & 1; -} - -static QPixmap resize9patch(QImage const &image, int dw, int dh) -{ - int sw = image.width(); - int sh = image.height(); - if (sw > 2 && sh > 2 && dw > 0 && dh > 0) { - QPixmap pixmap(dw, dh); - pixmap.fill(Qt::transparent); - QPainter pr(&pixmap); - pr.setRenderHint(QPainter::SmoothPixmapTransform); - - std::vector horz; - std::vector vert; - int horz_stretch = 0; - int vert_stretch = 0; - { - int pos; - QRgb last; - QRgb next; - pos = 0; - last = image.pixel(1, 0); - for (int x = 1; x < sw - 1; x++) { - next = image.pixel(x + 1, 0); - if (isStretchableMarker(last) != isStretchableMarker(next) || x == sw - 2) { - bool stretchable = isStretchableMarker(last); - int len = x - pos; - horz.push_back(Part(pos, len, stretchable)); - if (stretchable) horz_stretch += len; - last = next; - pos = x; - } - } - pos = 0; - last = image.pixel(0, 1); - for (int y = 1; y < sh - 1; y++) { - next = image.pixel(0, y + 1); - if (isStretchableMarker(last) != isStretchableMarker(next) || y == sh - 2) { - bool stretchable = isStretchableMarker(last); - int len = y - pos; - vert.push_back(Part(pos, len, stretchable)); - if (stretchable) vert_stretch += len; - last = next; - pos = y; - } - } - } - double horz_mul = 0; - double vert_mul = 0; - if (horz_stretch > 0) horz_mul = (double)(dw - (sw - 2 - horz_stretch)) / horz_stretch; - if (vert_stretch > 0) vert_mul = (double)(dh - (sh - 2 - vert_stretch)) / vert_stretch; - int dy0 = 0; - int dy1 = 0; - double vstretch = 0; - for (int i = 0; i < (int)vert.size(); i++) { - int sy0 = vert[i].pos; - int sy1 = vert[i].pos + vert[i].len; - if (i + 1 == (int)vert.size()) { - dy1 = dh; - } else if (vert[i].stretchable) { - vstretch += (double)vert[i].len * vert_mul; - double s = floor(vstretch); - vstretch -= s; - dy1 += (int)s; - } else { - dy1 += vert[i].len; - } - int dx0 = 0; - int dx1 = 0; - double hstretch = 0; - for (int j = 0; j < (int)horz.size(); j++) { - int sx0 = horz[j].pos; - int sx1 = horz[j].pos + horz[j].len; - if (j + 1 == (int)horz.size()) { - dx1 = dw; - } else if (horz[j].stretchable) { - hstretch += (double)horz[j].len * horz_mul; - double s = floor(hstretch); - hstretch -= s; - dx1 += (int)s; - } else { - dx1 += horz[j].len; - } - pr.drawImage(QRect(dx0, dy0, dx1 - dx0, dy1 - dy0), image, QRect(sx0 + 1, sy0 + 1, sx1 - sx0, sy1 - sy0)); - dx0 = dx1; - } - dy0 = dy1; - } - - return pixmap; - } - return QPixmap(); -} - -QPixmap QtNinePatch::createPixmapFromNinePatchImage(const QImage &image, int dw, int dh) -{ - int w = dw; - int h = dh; - if (w < image.width() || h < image.height()) { // shrink - if (w < image.width()) w = image.width(); - if (h < image.height()) h = image.height(); - QPixmap pm1 = resize9patch(image, w, h); - if (pm1.isNull()) return QPixmap(); - QPixmap pm2(dw, dh); - pm2.fill(Qt::transparent); - QPainter pr(&pm2); - pr.setRenderHint(QPainter::SmoothPixmapTransform); - pr.drawPixmap(0, 0, dw, dh, pm1, 0, 0, w, h); - return pm2; - } else { - return resize9patch(image, w, h); - } -} diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.h b/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.h deleted file mode 100644 index 782e4fa..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef QTNINEPATCH_H -#define QTNINEPATCH_H - -#include - -#if defined(QTNINEPATCHLIB_LIBRARY) -# define QTNINEPATCHLIBSHARED_EXPORT Q_DECL_EXPORT -#else -# define QTNINEPATCHLIBSHARED_EXPORT Q_DECL_IMPORT -#endif - -#include -#include -#include -#include - -class QtNinePatch; - -class QTNINEPATCHLIBSHARED_EXPORT QtNinePatch -{ - -public: - static QPixmap createPixmapFromNinePatchImage(const QImage &, int, int); -}; - -#endif // QTNINEPATCH_H diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro b/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro deleted file mode 100644 index 2910b39..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro +++ /dev/null @@ -1,38 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-10-25T14:12:10 -# -#------------------------------------------------- - -QT += core axcontainer gui - -#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -TARGET = QtNinePatch -TEMPLATE = lib -CONFIG += release -CONFIG += warn_off exceptions_off hide_symbols - -#CONFIG += staticlib -#CONFIG += dll static release - -DESTDIR = build -DLLDESTDIR = build - -DEFINES += QTNINEPATCHLIB_LIBRARY - -SOURCES += QtNinePatch.cpp - -HEADERS += QtNinePatch.h - -unix { - target.path = /usr/lib - INSTALLS += target -} - -DEFINES += _XKEYCHECK_H - -INCLUDEPATH += . -INCLUDEPATH += $$[QT_INSTALL_HEADERS] - -LIBS += -L$$[QT_INSTALL_LIBS] diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro.user b/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro.user deleted file mode 100644 index 70ed833..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/QtNinePatch.pro.user +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - EnvironmentId - {52a31565-4664-45f3-a98d-2ef2ad3b26ae} - - - ProjectExplorer.Project.ActiveTarget - 0 - - - ProjectExplorer.Project.EditorSettings - - true - false - true - - Cpp - - CppGlobal - - - - QmlJS - - QmlJSGlobal - - - 2 - UTF-8 - false - 4 - false - 80 - true - true - 1 - true - false - 0 - true - 0 - 8 - true - 1 - true - true - true - false - - - - ProjectExplorer.Project.PluginSettings - - - - ProjectExplorer.Project.Target.0 - - Desktop Qt 5.5.1 MSVC2010 32bit - Desktop Qt 5.5.1 MSVC2010 32bit - qt.55.win32_msvc2010_kit - 0 - 0 - 0 - - F:/Python/PyhtonTest/PyQt/QtNinePatch/build - - - true - qmake - - QtProjectManager.QMakeBuildStep - false - true - - false - false - false - - - true - Make - - Qt4ProjectManager.MakeStep - - false - - - - 2 - 构建 - - ProjectExplorer.BuildSteps.Build - - - - true - Make - - Qt4ProjectManager.MakeStep - - true - clean - - - 1 - 清理 - - ProjectExplorer.BuildSteps.Clean - - 2 - false - - Release - - Qt4ProjectManager.Qt4BuildConfiguration - 0 - true - - 1 - - - 0 - 部署 - - ProjectExplorer.BuildSteps.Deploy - - 1 - 在本地部署 - - ProjectExplorer.DefaultDeployConfiguration - - 1 - - - - false - false - false - false - true - 0.01 - 10 - true - 1 - 25 - - 1 - true - false - true - valgrind - - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - - 2 - - - - %{buildDir} - 自定义执行档 - - ProjectExplorer.CustomExecutableRunConfiguration - 3768 - false - true - false - false - true - - 1 - - - - ProjectExplorer.Project.TargetCount - 1 - - - ProjectExplorer.Project.Updater.FileVersion - 18 - - - Version - 18 - - diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.dll b/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.dll deleted file mode 100644 index 4ac6d9260c4110f7412002a2285a59024d700121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 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 Bf(ift diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.sip b/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.sip deleted file mode 100644 index a5a56d2..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/QtNinePatch.sip +++ /dev/null @@ -1,14 +0,0 @@ -%Module QtNinePatch -%Import QtCore/QtCoremod.sip -%Import QtGui/QtGuimod.sip - -class QtNinePatch -{ -%TypeHeaderCode -#include "../QtNinePatch.h" -%End - -public: - static QPixmap createPixmapFromNinePatchImage(const QImage &, int, int); - -}; \ No newline at end of file diff --git a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/configure.py b/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/configure.py deleted file mode 100644 index eae22a5..0000000 --- a/图片/显示.9格式图片/pyd版本/QtNinePatch/sip/configure.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python -# -*- encoding:utf-8 -*- - -import os -import shutil - -import PyQt5 -from PyQt5.QtCore import PYQT_CONFIGURATION -import sipconfig - - -# 模块名 -moduleName = 'QtNinePatch' - -# The name of the SIP build file generated by SIP and used by the build -# system. -build_file = '%s.sbf' % moduleName - -# Get the SIP configuration information. -config = sipconfig.Configuration() -# pyqt5.5 + python34 + msvc 2010 -config.platform = "win32-msvc2010" -qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010' -print('QT_DIR: %s' % qt_path) - -pyqtpath = os.path.dirname(PyQt5.__file__) -print('PyQt5 path: ', pyqtpath) - -config.sip_bin = os.path.join(pyqtpath, 'sip.exe') -config.default_sip_dir = os.path.join(pyqtpath, 'sip') - -sip_cmd = ' '.join([ - config.sip_bin, - '-c', "build", - '-b', "build/" + build_file, - '-I', config.default_sip_dir + '/PyQt5', - PYQT_CONFIGURATION.get('sip_flags', ''), - '%s.sip' % moduleName, -]) - -os.makedirs('build', exist_ok=True) -print(sip_cmd) -os.system(sip_cmd) - - -# Create the Makefile. -makefile = sipconfig.SIPModuleMakefile( - config, build_file, dir='build' -) - -# Add the library we are wrapping. The name doesn't include any platform -# specific prefixes or extensions (e.g. the 'lib' prefix on UNIX, or the -# '.dll' extension on Windows). - -# 添加头文件路径 -makefile.extra_include_dirs = [ - '../', '.', - os.path.join(qt_path, 'include'), - os.path.join(qt_path, 'include', 'QtCore'), - os.path.join(qt_path, 'include', 'QtGui') -] - -# 添加用C++编译的库文件路径 -makefile.extra_lib_dirs = [ - os.path.abspath('../build'), - os.path.join(qt_path, 'lib'), -] -print(makefile.extra_lib_dirs) - -makefile.extra_libs = [ - moduleName, - 'Qt5Core', - 'Qt5Gui' -] -print(makefile.extra_libs) - -# Generate the Makefile itself. -makefile.generate() - -shutil.copy('../build/%s.dll' % moduleName, '%s.dll' % moduleName) - -os.chdir('build') -os.system('nmake') - -os.chdir('../') -shutil.copy('build/%s.pyd' % moduleName, '%s.pyd' % moduleName) -print('ok') diff --git a/图片/显示.9格式图片/纯python版本1/NinePatch.py b/图片/显示.9格式图片/纯python版本1/NinePatch.py deleted file mode 100644 index d2703af..0000000 --- a/图片/显示.9格式图片/纯python版本1/NinePatch.py +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Created on 2018年10月25日 -@author: Irony -@site: https://pyqt5.com https://github.com/892768447 -@email: 892768447@qq.com -@file: NinePatch -@description: -""" -from math import fabs - -from PyQt5.QtCore import QRect -from PyQt5.QtGui import QImage, QColor, QPainter, qRed, qGreen, qBlue, qAlpha - - -__Author__ = """By: Irony -QQ: 892768447 -Email: 892768447@qq.com""" -__Copyright__ = "Copyright (c) 2018 Irony" -__Version__ = "Version 1.0" - - -class _Exception(Exception): - - def __init__(self, imgW, imgH): - self.imgW = imgW - self.imgH = imgH - - -class NinePatchException(Exception): - - def __str__(self): - return "Nine patch error" - - -class ExceptionIncorrectWidth(_Exception): - - def __str__(self): - return "Input incorrect width. Mimimum width = :{imgW}".format(imgW=self.imgW) - - -class ExceptionIncorrectWidthAndHeight(_Exception): - - def __str__(self): - return "Input incorrect width width and height. Minimum width = :{imgW} . Minimum height = :{imgH}".format(imgW=self.imgW, imgH=self.imgH) - - -class ExceptionIncorrectHeight(_Exception): - - def __str__(self): - return "Input incorrect height. Minimum height = :{imgW}".format(imgW=self.imgW) - - -class ExceptionNot9Patch(Exception): - - def __str__(self): - return "It is not nine patch image" - - -class NinePatch: - - def __init__(self, fileName): - self.CachedImage = None # 缓存图片 - self.OldWidth = -1 - self.OldHeight = -1 - self.ResizeDistancesX = [] - self.ResizeDistancesY = [] # [(int,int)]数组 - self.setImage(fileName) - - def width(self): - return self.Image.width() - - def height(self): - return self.Image.height() - - def setImage(self, fileName): - self.Image = QImage(fileName) - if self.Image.isNull(): - return - - self.ContentArea = self.GetContentArea() - self.GetResizeArea() - if not self.ResizeDistancesX or not self.ResizeDistancesY: - raise ExceptionNot9Patch - - def __del__(self): - if hasattr(self, "CachedImage"): - del self.CachedImage - if hasattr(self, "Image"): - del self.Image - - def Draw(self, painter, x, y): - painter.drawImage(x, y, self.CachedImage) - - def SetImageSize(self, width, height): - resizeWidth = 0 - resizeHeight = 0 - for i in range(len(self.ResizeDistancesX)): - resizeWidth += self.ResizeDistancesX[i][1] - - for i in range(len(self.ResizeDistancesY)): - resizeHeight += self.ResizeDistancesY[i][1] - - if (width < (self.Image.width() - 2 - resizeWidth) and height < (self.Image.height() - 2 - resizeHeight)): - raise ExceptionIncorrectWidthAndHeight( - self.Image.width() - 2, self.Image.height() - 2) - - if (width < (self.Image.width() - 2 - resizeWidth)): - raise ExceptionIncorrectWidth( - self.Image.width() - 2, self.Image.height() - 2) - - if (height < (self.Image.height() - 2 - resizeHeight)): - raise ExceptionIncorrectHeight( - self.Image.width() - 2, self.Image.height() - 2) - - if (width != self.OldWidth or height != self.OldHeight): - self.OldWidth = width - self.OldHeight = height - self.UpdateCachedImage(width, height) - - @classmethod - def GetContentAreaRect(self, width, height): - # print("GetContentAreaRect : width:%d height:%d" % (width, height)) - return (QRect(self.ContentArea.x(), self.ContentArea.y(), (width - (self.Image.width() - 2 - self.ContentArea.width())), - (height - (self.Image.height() - 2 - self.ContentArea.height())))) - - def DrawScaledPart(self, oldRect, newRect, painter): - if (newRect.width() and newRect.height()): - # print("DrawScaledPart newRect.width:%d newRect.height:%d" % (newRect.width() , newRect.height())) - img = self.Image.copy(oldRect) - img = img.scaled(newRect.width(), newRect.height()) - painter.drawImage(newRect.x(), newRect.y(), img, - 0, 0, newRect.width(), newRect.height()) - - def DrawConstPart(self, oldRect, newRect, painter): - # print("DrawConstPart oldRect:{oldRect} newRect:{newRect}".format(oldRect = oldRect, newRect = newRect)) - img = self.Image.copy(oldRect) - painter.drawImage(newRect.x(), newRect.y(), img, 0, - 0, newRect.width(), newRect.height()) - - def IsColorBlack(self, color): - r = qRed(color) - g = qGreen(color) - b = qBlue(color) - a = qAlpha(color) - if a < 128: - return False - return r < 128 and g < 128 and b < 128 - - def GetContentArea(self): - j = self.Image.height() - 1 - left = 0 - right = 0 - for i in range(self.Image.width()): - if (self.IsColorBlack(self.Image.pixel(i, j)) and left == 0): - left = i - else: - if (left != 0 and self.IsColorBlack(self.Image.pixel(i, j))): - right = i - - if (left and not right): - right = left - - left -= 1 - i = self.Image.width() - 1 - top = 0 - bot = 0 - - for j in range(self.Image.height()): - if (self.IsColorBlack(self.Image.pixel(i, j)) and top == 0): - top = j - else: - if (top and self.IsColorBlack(self.Image.pixel(i, j))): - bot = j - - if (top and not bot): - bot = top - top -= 1 - # print("GetContentArea left: %d top:%d %d %d" % (left, top, right - left, bot - top)) - return (QRect(left, top, right - left, bot - top)) - - def GetResizeArea(self): - j = 0 - left = 0 - right = 0 - - for i in range(self.Image.width()): - if (self.IsColorBlack(self.Image.pixel(i, j)) and left == 0): - left = i - if (left and self.IsColorBlack(self.Image.pixel(i, j)) and not self.IsColorBlack(self.Image.pixel(i + 1, j))): - right = i - left -= 1 - # print("ResizeDistancesX.append ", left, " ", right - left) - self.ResizeDistancesX.append((left, right - left)) - right = 0 - left = 0 - i = 0 - top = 0 - bot = 0 - - for j in range(self.Image.height()): - if (self.IsColorBlack(self.Image.pixel(i, j)) and top == 0): - top = j - - if (top and self.IsColorBlack(self.Image.pixel(i, j)) and not self.IsColorBlack(self.Image.pixel(i, j + 1))): - bot = j - top -= 1 - # print("ResizeDistancesY.append ", top, " ", bot - top) - self.ResizeDistancesY.append((top, bot - top)) - top = 0 - bot = 0 - # print(self.ResizeDistancesX, len(self.ResizeDistancesX)) - # print(self.ResizeDistancesY, len(self.ResizeDistancesY)) - - def GetFactor(self, width, height, factorX, factorY): - topResize = width - (self.Image.width() - 2) - leftResize = height - (self.Image.height() - 2) - for i in range(len(self.ResizeDistancesX)): - topResize += self.ResizeDistancesX[i][1] - factorX += self.ResizeDistancesX[i][1] - - for i in range(len(self.ResizeDistancesY)): - leftResize += self.ResizeDistancesY[i][1] - factorY += self.ResizeDistancesY[i][1] - - factorX = float(topResize) / factorX - factorY = float(leftResize) / factorY - return factorX, factorY - - def UpdateCachedImage(self, width, height): - # print("UpdateCachedImage: ", width, " " , height) - self.CachedImage = QImage( - width, height, QImage.Format_ARGB32_Premultiplied) - self.CachedImage.fill(QColor(0, 0, 0, 0)) - painter = QPainter(self.CachedImage) - factorX = 0.0 - factorY = 0.0 - factorX, factorY = self.GetFactor(width, height, factorX, factorY) - # print("after GetFactor: ", width, height, factorX, factorY) - lostX = 0.0 - lostY = 0.0 - x1 = 0 # for image parts X - y1 = 0 # for image parts Y -# widthResize # width for image parts -# heightResize # height for image parts - resizeX = 0 - resizeY = 0 - offsetX = 0 - offsetY = 0 - for i in range(len(self.ResizeDistancesX)): - y1 = 0 - offsetY = 0 - lostY = 0.0 - for j in range(len(self.ResizeDistancesY)): - widthResize = self.ResizeDistancesX[i][0] - x1 - heightResize = self.ResizeDistancesY[j][0] - y1 - - self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, heightResize), - QRect(x1 + offsetX, y1 + offsetY, widthResize, heightResize), painter) - - y2 = self.ResizeDistancesY[j][0] - heightResize = self.ResizeDistancesY[j][1] - resizeY = round(float(heightResize) * factorY) - lostY += resizeY - (float(heightResize) * factorY) - if (fabs(lostY) >= 1.0): - if (lostY < 0): - resizeY += 1 - lostY += 1.0 - else: - resizeY -= 1 - lostY -= 1.0 - - self.DrawScaledPart(QRect(x1 + 1, y2 + 1, widthResize, heightResize), - QRect(x1 + offsetX, y2 + offsetY, widthResize, resizeY), painter) - - x2 = self.ResizeDistancesX[i][0] - widthResize = self.ResizeDistancesX[i][1] - heightResize = self.ResizeDistancesY[j][0] - y1 - resizeX = round(float(widthResize) * factorX) - lostX += resizeX - (float(widthResize) * factorX) - if (fabs(lostX) >= 1.0): - if (lostX < 0): - resizeX += 1 - lostX += 1.0 - else: - resizeX -= 1 - lostX -= 1.0 - - self.DrawScaledPart(QRect(x2 + 1, y1 + 1, widthResize, heightResize), - QRect(x2 + offsetX, y1 + offsetY, resizeX, heightResize), painter) - - heightResize = self.ResizeDistancesY[j][1] - self.DrawScaledPart(QRect(x2 + 1, y2 + 1, widthResize, heightResize), - QRect(x2 + offsetX, y2 + offsetY, resizeX, resizeY), painter) - - y1 = self.ResizeDistancesY[j][0] + self.ResizeDistancesY[j][1] - offsetY += resizeY - self.ResizeDistancesY[j][1] - - x1 = self.ResizeDistancesX[i][0] + self.ResizeDistancesX[i][1] - offsetX += resizeX - self.ResizeDistancesX[i][1] - - x1 = self.ResizeDistancesX[len( - self.ResizeDistancesX) - 1][0] + self.ResizeDistancesX[len(self.ResizeDistancesX) - 1][1] - widthResize = self.Image.width() - x1 - 2 - y1 = 0 - lostX = 0.0 - lostY = 0.0 - offsetY = 0 - for i in range(len(self.ResizeDistancesY)): - self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, self.ResizeDistancesY[i][0] - y1), - QRect(x1 + offsetX, y1 + offsetY, widthResize, self.ResizeDistancesY[i][0] - y1), painter) - y1 = self.ResizeDistancesY[i][0] - resizeY = round(float(self.ResizeDistancesY[i][1]) * factorY) - lostY += resizeY - (float(self.ResizeDistancesY[i][1]) * factorY) - if (fabs(lostY) >= 1.0): - if (lostY < 0): - resizeY += 1 - lostY += 1.0 - else: - resizeY -= 1 - lostY -= 1.0 - - self.DrawScaledPart(QRect(x1 + 1, y1 + 1, widthResize, self.ResizeDistancesY[i][1]), - QRect(x1 + offsetX, y1 + offsetY, widthResize, resizeY), painter) - y1 = self.ResizeDistancesY[i][0] + self.ResizeDistancesY[i][1] - offsetY += resizeY - self.ResizeDistancesY[i][1] - - y1 = self.ResizeDistancesY[len( - self.ResizeDistancesY) - 1][0] + self.ResizeDistancesY[len(self.ResizeDistancesY) - 1][1] - heightResize = self.Image.height() - y1 - 2 - x1 = 0 - offsetX = 0 - for i in range(len(self.ResizeDistancesX)): - self.DrawConstPart(QRect(x1 + 1, y1 + 1, self.ResizeDistancesX[i][0] - x1, heightResize), - QRect(x1 + offsetX, y1 + offsetY, self.ResizeDistancesX[i][0] - x1, heightResize), painter) - x1 = self.ResizeDistancesX[i][0] - resizeX = round(float(self.ResizeDistancesX[i][1]) * factorX) - lostX += resizeX - (float(self.ResizeDistancesX[i][1]) * factorX) - if (fabs(lostX) >= 1.0): - if (lostX < 0): - resizeX += 1 - lostX += 1.0 - else: - resizeX -= 1 - lostX += 1.0 - - self.DrawScaledPart(QRect(x1 + 1, y1 + 1, self.ResizeDistancesX[i][1], heightResize), - QRect(x1 + offsetX, y1 + offsetY, resizeX, heightResize), painter) - x1 = self.ResizeDistancesX[i][0] + self.ResizeDistancesX[i][1] - offsetX += resizeX - self.ResizeDistancesX[i][1] - - x1 = self.ResizeDistancesX[len( - self.ResizeDistancesX) - 1][0] + self.ResizeDistancesX[len(self.ResizeDistancesX) - 1][1] - widthResize = self.Image.width() - x1 - 2 - y1 = self.ResizeDistancesY[len( - self.ResizeDistancesY) - 1][0] + self.ResizeDistancesY[len(self.ResizeDistancesY) - 1][1] - heightResize = self.Image.height() - y1 - 2 - self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, heightResize), - QRect(x1 + offsetX, y1 + offsetY, widthResize, heightResize), painter) diff --git a/图片/显示.9格式图片/纯python版本1/skin_aio_friend_bubble_pressed.9.png b/图片/显示.9格式图片/纯python版本1/skin_aio_friend_bubble_pressed.9.png deleted file mode 100644 index 9fc0aeb51a2196f3efe1b9b2e78cacb82f58d8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6566 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 Y0p-Z_EFYX2y8r+H07*qoM6N<$f}qEpVE_OC diff --git a/图片/显示.9格式图片/纯python版本2/QtNinePatch.py b/图片/显示.9格式图片/纯python版本2/QtNinePatch.py deleted file mode 100644 index 8131b9e..0000000 --- a/图片/显示.9格式图片/纯python版本2/QtNinePatch.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Created on 2018年10月25日 -@author: Irony -@site: https://pyqt5.com https://github.com/892768447 -@email: 892768447@qq.com -@file: QtNinePatch -@description: -""" -from math import floor - -from PyQt5.QtCore import Qt, QRect -from PyQt5.QtGui import qAlpha, QPixmap, QPainter - - -__Author__ = """By: Irony -QQ: 892768447 -Email: 892768447@qq.com""" -__Copyright__ = "Copyright (c) 2018 Irony" -__Version__ = "Version 1.0" - - -class Part: - - def __init__(self, pos=0, length=0, stretchable=False): - self.pos = pos - self.length = length - self.stretchable = stretchable - - -def isStretchableMarker(pixel): - return (qAlpha(pixel) >> 7) & 1 - - -def resize9patch(image, dw, dh): - sw = image.width() - sh = image.height() - if sw > 2 and sh > 2 and dw > 0 and dh > 0: - pixmap = QPixmap(dw, dh) - pixmap.fill(Qt.transparent) - pr = QPainter(pixmap) - pr.setRenderHint(QPainter.Antialiasing) - pr.setRenderHint(QPainter.SmoothPixmapTransform) - - horz = [] - vert = [] - horz_stretch = 0 - vert_stretch = 0 - - pos = 0 - last = image.pixel(1, 0) - for x in range(1, sw - 1): - nextP = image.pixel(x + 1, 0) - if isStretchableMarker(last) != isStretchableMarker(nextP) or x == sw - 2: - stretchable = isStretchableMarker(last) - length = x - pos - horz.append(Part(pos, length, stretchable)) - if stretchable: - horz_stretch += length - last = nextP - pos = x - pos = 0 - last = image.pixel(0, 1) - for y in range(1, sh - 1): - nextP = image.pixel(0, y + 1) - if isStretchableMarker(last) != isStretchableMarker(nextP) or y == sh - 2: - stretchable = isStretchableMarker(last) - length = y - pos - vert.append(Part(pos, length, stretchable)) - if stretchable: - vert_stretch += length - last = nextP - pos = y - - horz_mul = 0 - vert_mul = 0 - if horz_stretch > 0: - horz_mul = float((dw - (sw - 2 - horz_stretch)) / horz_stretch) - if vert_stretch > 0: - vert_mul = float((dh - (sh - 2 - vert_stretch)) / vert_stretch) - dy0 = 0 - dy1 = 0 - vstretch = 0 - len_vert = len(vert) - len_horz = len(horz) - for i in range(len_vert): - sy0 = vert[i].pos - sy1 = vert[i].pos + vert[i].length - if i + 1 == len_vert: - dy1 = dh - elif vert[i].stretchable: - vstretch += float(vert[i].length * vert_mul) - s = floor(vstretch) - vstretch -= s - dy1 += int(s) - else: - dy1 += vert[i].length - dx0 = 0 - dx1 = 0 - hstretch = 0 - for j in range(len_horz): - sx0 = horz[j].pos - sx1 = horz[j].pos + horz[j].length - if j + 1 == len_horz: - dx1 = dw - elif horz[j].stretchable: - hstretch += float(horz[j].length * horz_mul) - s = floor(hstretch) - hstretch -= s - dx1 += int(s) - else: - dx1 += horz[j].length - pr.drawImage(QRect(dx0, dy0, dx1 - dx0, dy1 - dy0), - image, QRect(sx0 + 1, sy0 + 1, sx1 - sx0, sy1 - sy0)) - dx0 = dx1 - dy0 = dy1 - return pixmap - return QPixmap() - - -def createPixmapFromNinePatchImage(image, dw, dh): - w = dw - h = dh - if w < image.width() or h < image.height(): # shrink - w = max(image.width(), w) - h = max(image.height(), h) - pm1 = resize9patch(image, w, h) - if pm1.isNull(): - return QPixmap() - pm2 = QPixmap(dw, dh) - pm2.fill(Qt.transparent) - pr = QPainter(pm2) - pr.setRenderHint(QPainter.Antialiasing) - pr.setRenderHint(QPainter.SmoothPixmapTransform) - pr.drawPixmap(0, 0, dw, dh, pm1, 0, 0, w, h) - return pm2 - else: - return resize9patch(image, dw, dh) diff --git a/图片/显示.9格式图片/纯python版本2/skin_aio_friend_bubble_pressed.9.png b/图片/显示.9格式图片/纯python版本2/skin_aio_friend_bubble_pressed.9.png deleted file mode 100644 index 9fc0aeb51a2196f3efe1b9b2e78cacb82f58d8f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6566 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 Y0p-Z_EFYX2y8r+H07*qoM6N<$f}qEpVE_OC