{"id":549,"date":"2023-05-30T23:27:31","date_gmt":"2023-05-30T15:27:31","guid":{"rendered":"https:\/\/guagefangzhen.cn\/?p=549"},"modified":"2023-11-01T21:03:27","modified_gmt":"2023-11-01T13:03:27","slug":"%e3%80%90python%e3%80%91gifspliter-gif%e5%88%86%e5%89%b2%e5%99%a8","status":"publish","type":"post","link":"https:\/\/guagefangzhen.cn\/?p=549","title":{"rendered":"\u3010Python\u3011GifSpliter \u201cGIF\u5206\u5272\u5668\u201d"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u201cGifSpliter\u201d GIF\u5206\u5272\u5668<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528PyQt5\u91cd\u5199\u4e86\u4e00\u4e2a\u201cGIF\u5206\u5272\u5668\u201d\u7684\u5c0f\u5e94\u7528\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"658\" height=\"527\" data-src=\"https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/05\/\u56fe\u7247-7.png\" alt=\"\" class=\"wp-image-550 lazyload\" style=\"--smush-placeholder-width: 658px; --smush-placeholder-aspect-ratio: 658\/527;width:494px;height:395px\" data-srcset=\"https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/05\/\u56fe\u7247-7.png 658w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/05\/\u56fe\u7247-7-300x240.png 300w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/05\/\u56fe\u7247-7-624x500.png 624w\" data-sizes=\"(max-width: 658px) 100vw, 658px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u529f\u80fd\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e3b\u8981\u5c31\u662f\u4e3a\u4e86\u80fd\u5feb\u901f\u5206\u89e3GIF\u6587\u4ef6\uff0c\u5c06\u6240\u6709\u5e27\u4fdd\u5b58\u6210PNG\u683c\u5f0f\u3002<\/li>\n\n\n\n<li>\u652f\u6301\u6587\u4ef6\u62d6\u62fd\u8fdb\u7a97\u53e3\uff0c\u4e5f\u662f\u552f\u4e00\u7684\u6587\u4ef6\u8f93\u5165\u65b9\u5f0f\uff0c\u5c31\u662f\u7b80\u5355\u66b4\u529b\uff0c\u76f4\u63a5\u65b9\u4fbf\uff0cxD\u3002<\/li>\n\n\n\n<li>\u53ef\u9009\u62e9\u7684\u8f93\u51fa\u4f4d\u7f6e\uff1a\u53ef\u4ee5\u6307\u5b9a\u4f4d\u7f6e\uff0c\u4e5f\u53ef\u4ee5\u5728\u539f\u6587\u4ef6\u6240\u5728\u4f4d\u7f6e\u7ed9\u4f60\u8f93\u51fa\u5206\u5272\u5e27\u3002<\/li>\n\n\n\n<li>\u53ef\u4ee5\u62d6\u62fd\u6587\u4ef6\u5939\u8f93\u5165\uff0c\u53ea\u8981\u4f60\u6587\u4ef6\u5939\u91cc\u6709gif\uff0c\u90fd\u7ed9\u4f60\u5904\u7406\u4e86\u3002<\/li>\n\n\n\n<li>\u652f\u6301\u6df7\u5408\u8f93\u5165\u6a21\u5f0f\u3002\u53ef\u4ee5\u540c\u65f6\u9009\u4e2d\u591a\u4e2agif\uff0c\u6216\u8005gif+\u6587\u4ef6\u5939\u7684\u591a\u4e2a\u6587\u4ef6\u8f93\u5165\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u73b0\u6210\u7684\u8f6f\u4ef6 GifSpliter_v3.2\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u94fe\u63a5\uff1ahttps:\/\/pan.baidu.com\/s\/1JJLOF1vDYpd7pRzrtr93Xg?pwd=ucuo<br>\u63d0\u53d6\u7801\uff1aucuo<br>&#8211;\u6765\u81ea\u767e\u5ea6\u7f51\u76d8\u8d85\u7ea7\u4f1a\u5458V6\u7684\u5206\u4eab<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e3a\u4ec0\u4e48\u505a\u8fd9\u4e2a\uff1f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">COMSOL\u4eff\u771f\u5bfc\u51faGIF\u56fe\u5f88\u65b9\u4fbf\uff0c\u4f46\u662f\u60f3\u8981\u5bfc\u51fa\u4e0d\u540c\u65f6\u523b\u53c2\u6570\u4e0b\u7684\u591a\u4e2a\u56fe\u50cf\u5f88\u4e0d\u65b9\u4fbf\u3002\u90a3&#8230;&#8230;\u4e0d\u5982\u76f4\u63a5\u5bfc\u51faGIF\u540e\u518d\u5206\u5272\uff1f<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\u7f51\u4e0a\u6ca1\u6709\u8fd9\u79cd\u8f7b\u91cf\u7ea7\u7684\uff0c\u7b80\u5355\u66b4\u529b\uff0c\u5408\u6211\u9700\u6c42\u7684\u5e94\u7528\uff0c\u90a3\u76f4\u63a5\u81ea\u5df1\u64b8\u4e00\u4e2a\u5c0f\u5de5\u5177\uff01<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u73b0\u5728\uff0c\u76f4\u63a5\u9009\u4e2d\u6587\u4ef6\u62d6\u8fdb\u53bb\uff0c\u7b49\u51e0\u79d2\u5c31\u597d\u4e86\uff0c\u591a\u597d\uff1f<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Update History<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">v3.2 231031<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e30\u5bcc\u4e86\u63a7\u5236\u53f0\u6253\u5370\u4fe1\u606f\uff0c\u589e\u52a0\u4e86\u5f69\u8272\u7684\u63a7\u5236\u53f0\u8f93\u51fa\uff0c\u5e76\u6dfb\u52a0\u4e86\u5904\u7406\u8fdb\u5ea6\u6761\uff1b<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"244\" data-src=\"https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247-1024x244.png\" alt=\"\" class=\"wp-image-688 lazyload\" data-srcset=\"https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247-1024x244.png 1024w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247-300x72.png 300w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247-768x183.png 768w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247-624x149.png 624w, https:\/\/guagefangzhen.cn\/wp-content\/uploads\/2023\/11\/\u56fe\u7247.png 1342w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/244;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">v3.1 230831<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p>\u4fdd\u7559\u4e86\u63a7\u5236\u53f0\u7a97\u53e3\uff0c\u5e76\u4f18\u5316\u4e86\u63a7\u5236\u53f0\u8f93\u51fa\uff0c\u73b0\u5728\u53ef\u4ee5\u901a\u8fc7\u63a7\u5236\u53f0\u8f93\u51fa\u4fe1\u606f\u67e5\u770b\u5904\u7406<\/p>\u60c5\u51b5<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">v3.0 230631<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PyQt5\u8bbe\u8ba1\u4e86\u5168\u65b0\u7684\u7a97\u53e3\uff1b<\/li>\n\n\n\n<li>\u589e\u52a0\u4e86\u6587\u4ef6\u5939\u6a21\u5f0f\uff1b<\/li>\n\n\n\n<li>\u589e\u52a0\u4e86\u591a\u79cd\u8f93\u51fa\u6a21\u5f0f\u7684\u9009\u62e9\uff1b<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">v2.0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u589e\u52a0\u4e86\u591a\u6587\u4ef6\u5904\u7406\u6a21\u5f0f\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">v1.0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tinkter\u754c\u9762\uff0c\u5355gif\u6587\u4ef6\u7684\u5904\u7406\u65b9\u5f0f\uff0c\u9ed8\u8ba4\u8f93\u51fa\u5230exe\u6240\u5728\u6587\u4ef6\u5939\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">SourceCode<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"classic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"mian.py\" data-enlighter-group=\"GifSpliter\">import sys\nimport os\nfrom PyQt5.QtWidgets import *\nfrom PyQt5.QtGui import *\nfrom ui_GifSpliter import *\nfrom spliter import GifSplitter\nimport res_rc\n\nclass MyGifSpliter(QWidget):\n    def __init__(self, parent=None):\n        super().__init__(parent)  # \u8c03\u7528\u7236\u7c7b\u6784\u9020\u51fd\u6570\n        self.__ui = Ui_GifSpliter()\n        self.__ui.setupUi(self)\n        self.appDir = sys.path[0]\n        print(self.appDir)\n        self.gifDir = self.appDir\n        self.gifDir = self.appDir\n        self.specDir = self.appDir\n        self.outDir = self.appDir\n        self.__ui.textEdit_DirSpec.setText(self.appDir)\n        # \u8c03\u7528Drops\u65b9\u6cd5\n        # self.drawn()\n        self.__ui.radioButton_DirSpec.clicked.connect(self.do_setSpecDir)\n\n\n    # \u9f20\u6807\u62d6\u5165\u4e8b\u4ef6\n    def dragEnterEvent(self, event):\n        if event.mimeData().hasUrls:\n            event.accept()\n        else:\n            event.ignore()\n\n    # \u9f20\u6807\u653e\u5f00\u6267\u884c\n    def dropEvent(self, event):\n        \"\"\"\u83b7\u53d6\u62d6\u62fd\u6587\u4ef6\u7684\u8def\u5f84\"\"\"\n        files = []\n        for url in event.mimeData().urls():\n            path = url.toLocalFile()\n            files.append(path)\n        # \u6253\u5370\u62d6\u4f4f\u8fdb\u5165\u7a97\u53e3\u7684\u6587\u4ef6\u8def\u5f84\n        self.gifDir = os.path.split(files[0])[0]\n        # print(f'\u62d6\u62fd\u6587\u4ef6\u8def\u5f84\u4e3a\uff1a\"{self.gifDir}\"')\n\n        # \u5224\u65ad\u8f93\u51fa\u6a21\u5f0f\n        if self.__ui.radioButton_DirGif.isEnabled():\n            self.outDir = self.gifDir + '\/\u5206\u5272\u540ePNG'\n            if not os.path.exists(self.outDir):\n                os.mkdir(self.outDir)\n        elif self.__ui.radioButton_DirApp.isEnabled():\n            self.outDir = self.appDir\n        elif self.__ui.radioButton_DirSpec.isEnabled():\n            self.outDir = self.specDir\n        # print(f'\u8f93\u51fa\u6587\u4ef6\u5939\u4e3a\uff1a\"{self.outDir}\"')\n\n        # \u5904\u7406\u83b7\u53d6\u7684\u6587\u4ef6\n        for file in files:\n            # \u6587\u4ef6\u5939\n            if os.path.isdir(file):\n                # print(f'{file}\u662f\u6587\u4ef6\u5939')\n                self.gifDir = file\n                self.outDir = self.gifDir + '\/\u5206\u5272\u540ePNG'\n                if not os.path.exists(self.outDir):\n                    os.mkdir(self.outDir)\n                GifSplitter.split_gifs_in_folder(file, save_folder=self.outDir)\n                print(f'\\033[92m\u5b8c\u6210\u5bf9\u6587\u4ef6\u5939\uff1a\"{file}\"\u7684\u5904\u7406~~~\\033[0m')\n            # \u6587\u4ef6\n            else:\n                # \u5224\u65ad\u6269\u5c55\u540d\u662f\u5426\u4e3a.gif\n                if file.lower().endswith('.gif'):\n                    # print(f'{file}\u662fgif\u6587\u4ef6')\n                    GifSplitter(file).export_frames(save_folder=self.outDir)\n                else:\n                    print(f'\\033[91m! \"{os.path.basename(file)}\" \u4e0d\u662fGIF\u6587\u4ef6~~~!\\033[0m')\n        if self.__ui.checkBox_openDirSpec.isChecked():\n            os.startfile(self.outDir)\n\n    #\u8bbe\u5b9a\u80cc\u666f\u56fe\u7247\n    # def drawn(self):\n    #     self.__ui.palette = QPalette()\n    #     self.__ui.palette.setBrush(QPalette.Background, QBrush(QPixmap(\"BackGround1.png\")))\n    #     self.setPalette(self.__ui.palette)\n\n    # \u6839\u636eradioButton\u8bbe\u5b9a\u6587\u4ef6\u8def\u5f84\n    def do_setSpecDir(self):\n        if self.__ui.radioButton_DirSpec.isChecked():\n            self.specDir = QFileDialog.getExistingDirectory(None,\"\u9009\u53d6PNG\u8f93\u51fa\u6587\u4ef6\u5939\",\"\")\n            self.__ui.textEdit_DirSpec.setText(self.specDir)\n            print(f'\u8bbe\u5b9a\u6307\u5b9a\u8f93\u51fa\u8def\u5f84\u4e3a\uff1a{self.specDir}')\n\n\nif __name__ == \"__main__\":\n    app = QApplication(sys.argv)\n    e = MyGifSpliter()\n    e.show()\n    sys.exit(app.exec_())<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"ui_GifSpliter\" data-enlighter-group=\"GifSpliter\"># -*- coding: utf-8 -*-\n\n# Form implementation generated from reading ui file 'ui_GifSpliter.ui'\n#\n# Created by: PyQt5 UI code generator 5.15.9\n#\n# WARNING: Any manual changes made to this file will be lost when pyuic5 is\n# run again.  Do not edit this file unless you know what you are doing.\n\n\nfrom PyQt5 import QtCore, QtGui, QtWidgets\n\n\nclass Ui_GifSpliter(object):\n    def setupUi(self, GifSpliter):\n        GifSpliter.setObjectName(\"GifSpliter\")\n        GifSpliter.resize(640, 480)\n        GifSpliter.setMinimumSize(QtCore.QSize(640, 480))\n        GifSpliter.setMaximumSize(QtCore.QSize(640, 480))\n        font = QtGui.QFont()\n        font.setFamily(\"\u5fae\u8f6f\u96c5\u9ed1\")\n        font.setPointSize(11)\n        font.setBold(True)\n        font.setUnderline(False)\n        font.setWeight(75)\n        GifSpliter.setFont(font)\n        GifSpliter.setAcceptDrops(True)\n        icon = QtGui.QIcon()\n        icon.addPixmap(QtGui.QPixmap(\":\/icon\/C cyn.png\"), QtGui.QIcon.Normal, QtGui.QIcon.Off)\n        GifSpliter.setWindowIcon(icon)\n        GifSpliter.setStyleSheet(\"\")\n        self.verticalLayout_2 = QtWidgets.QVBoxLayout(GifSpliter)\n        self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)\n        self.verticalLayout_2.setObjectName(\"verticalLayout_2\")\n        self.label = QtWidgets.QLabel(GifSpliter)\n        self.label.setMinimumSize(QtCore.QSize(0, 0))\n        font = QtGui.QFont()\n        font.setFamily(\"\u5fae\u8f6f\u96c5\u9ed1\")\n        font.setBold(False)\n        font.setWeight(50)\n        self.label.setFont(font)\n        self.label.setAcceptDrops(True)\n        self.label.setFrameShape(QtWidgets.QFrame.NoFrame)\n        self.label.setFrameShadow(QtWidgets.QFrame.Plain)\n        self.label.setLineWidth(1)\n        self.label.setTextFormat(QtCore.Qt.AutoText)\n        self.label.setAlignment(QtCore.Qt.AlignCenter)\n        self.label.setOpenExternalLinks(True)\n        self.label.setObjectName(\"label\")\n        self.verticalLayout_2.addWidget(self.label)\n        self.horizontalLayout = QtWidgets.QHBoxLayout()\n        self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)\n        self.horizontalLayout.setObjectName(\"horizontalLayout\")\n        self.radioButton_DirGif = QtWidgets.QRadioButton(GifSpliter)\n        self.radioButton_DirGif.setChecked(True)\n        self.radioButton_DirGif.setObjectName(\"radioButton_DirGif\")\n        self.horizontalLayout.addWidget(self.radioButton_DirGif)\n        self.radioButton_DirSpec = QtWidgets.QRadioButton(GifSpliter)\n        self.radioButton_DirSpec.setChecked(False)\n        self.radioButton_DirSpec.setObjectName(\"radioButton_DirSpec\")\n        self.horizontalLayout.addWidget(self.radioButton_DirSpec)\n        self.radioButton_DirApp = QtWidgets.QRadioButton(GifSpliter)\n        self.radioButton_DirApp.setChecked(False)\n        self.radioButton_DirApp.setObjectName(\"radioButton_DirApp\")\n        self.horizontalLayout.addWidget(self.radioButton_DirApp)\n        self.verticalLayout_2.addLayout(self.horizontalLayout)\n        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()\n        self.horizontalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)\n        self.horizontalLayout_2.setObjectName(\"horizontalLayout_2\")\n        self.label_2 = QtWidgets.QLabel(GifSpliter)\n        self.label_2.setObjectName(\"label_2\")\n        self.horizontalLayout_2.addWidget(self.label_2)\n        self.textEdit_DirSpec = QtWidgets.QTextEdit(GifSpliter)\n        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Ignored)\n        sizePolicy.setHorizontalStretch(0)\n        sizePolicy.setVerticalStretch(0)\n        sizePolicy.setHeightForWidth(self.textEdit_DirSpec.sizePolicy().hasHeightForWidth())\n        self.textEdit_DirSpec.setSizePolicy(sizePolicy)\n        font = QtGui.QFont()\n        font.setPointSize(9)\n        font.setBold(False)\n        font.setWeight(50)\n        self.textEdit_DirSpec.setFont(font)\n        self.textEdit_DirSpec.setObjectName(\"textEdit_DirSpec\")\n        self.horizontalLayout_2.addWidget(self.textEdit_DirSpec)\n        self.checkBox_openDirSpec = QtWidgets.QCheckBox(GifSpliter)\n        self.checkBox_openDirSpec.setObjectName(\"checkBox_openDirSpec\")\n        self.horizontalLayout_2.addWidget(self.checkBox_openDirSpec)\n        self.verticalLayout_2.addLayout(self.horizontalLayout_2)\n        self.verticalLayout_2.setStretch(0, 1)\n\n        self.retranslateUi(GifSpliter)\n        QtCore.QMetaObject.connectSlotsByName(GifSpliter)\n\n    def retranslateUi(self, GifSpliter):\n        _translate = QtCore.QCoreApplication.translate\n        GifSpliter.setWindowTitle(_translate(\"GifSpliter\", \"GIF\u6587\u4ef6\u5206\u5272\u5668 v3.0\"))\n        self.label.setText(_translate(\"GifSpliter\", \"&lt;html>&lt;head\/>&lt;body>&lt;p align=\\\"center\\\">GIF\u6587\u4ef6\u5206\u5272\u5668:   \u53ef\u4ee5\u5feb\u901f\u5c06GIF\u6587\u4ef6\u5206\u5272\u6210\u9010\u5e27PNG\u6587\u4ef6&lt;\/p>&lt;p align=\\\"center\\\">-------------------------------------------------------------&lt;\/p>&lt;p align=\\\"center\\\">\u4f7f\u7528\u65b9\u6cd5:&lt;\/p>&lt;p align=\\\"center\\\">\u5c06GIF\u6587\u4ef6\u6216\u542b\u6709\u591a\u4e2aGIF\u7684\u6587\u4ef6\u5939\u62d6\u62fd\u8fdb\u6b64\u7a97\u53e3\u5373\u53ef&lt;\/p>&lt;p align=\\\"center\\\">\u7a0b\u5e8f\u4f1a\u81ea\u52a8\u5206\u89e3\u6240\u6709\u62d6\u62fd\u8fdb\u6765\u7684GIF\u5e76\u5206\u89e3\u6210\u5355\u5f20PNG\u6587\u4ef6&lt;\/p>&lt;p align=\\\"center\\\">\u53ef\u4ee5\u5728\u4e0b\u9762\u5355\u9009\u6309\u94ae\u4e2d\u9009\u62e9PNG\u6587\u4ef6\u8f93\u51fa\u4f4d\u7f6e&lt;\/p>&lt;p align=\\\"center\\\">\u5982\u679c\u9700\u8981\u9009\u62e9\u751f\u6210\u5230\u7279\u5b9a\u6587\u4ef6\u5939\uff0c\u9700\u8981\u6307\u5b9a\u8f93\u51fa\u6587\u4ef6\u5939&lt;\/p>&lt;p align=\\\"center\\\">&lt;br\/>-------------------------------------------------------------&lt;\/p>&lt;p align=\\\"center\\\">&lt;a href=\\\"https:\/\/guagefangzhen.cn\/\\\">&lt;span style=\\\" text-decoration: underline; color:#0000ff;\\\">\u66f4\u591a\u5206\u4eab\uff1ahttps:\/\/guagefangzhen.cn&lt;\/span>&lt;\/a>&lt;br\/>&lt;\/p>&lt;\/body>&lt;\/html>\"))\n        self.radioButton_DirGif.setText(_translate(\"GifSpliter\", \"\u751f\u6210\u5230GIF\u6240\u5728\u76ee\u5f55\"))\n        self.radioButton_DirSpec.setText(_translate(\"GifSpliter\", \"\u751f\u6210\u5230\u6307\u5b9a\u76ee\u5f55\"))\n        self.radioButton_DirApp.setText(_translate(\"GifSpliter\", \"\u751f\u6210\u5230\u7a0b\u5e8f\u6240\u5728\u76ee\u5f55\"))\n        self.label_2.setText(_translate(\"GifSpliter\", \"\u6307\u5b9a\u8f93\u51fa\u76ee\u5f55\uff1a\"))\n        self.textEdit_DirSpec.setHtml(_translate(\"GifSpliter\", \"&lt;!DOCTYPE HTML PUBLIC \\\"-\/\/W3C\/\/DTD HTML 4.0\/\/EN\\\" \\\"http:\/\/www.w3.org\/TR\/REC-html40\/strict.dtd\\\">\\n\"\n\"&lt;html>&lt;head>&lt;meta name=\\\"qrichtext\\\" content=\\\"1\\\" \/>&lt;style type=\\\"text\/css\\\">\\n\"\n\"p, li { white-space: pre-wrap; }\\n\"\n\"&lt;\/style>&lt;\/head>&lt;body style=\\\" font-family:\\'SimSun\\'; font-size:9pt; font-weight:400; font-style:normal;\\\">\\n\"\n\"&lt;p style=\\\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\\\">\u6307\u5b9a\u5206\u5272\u5e27\u6587\u4ef6\u8f93\u51fa\u8def\u5f84&lt;\/p>&lt;\/body>&lt;\/html>\"))\n        self.checkBox_openDirSpec.setText(_translate(\"GifSpliter\", \"\u5206\u5272\u540e\u6253\u5f00\u76ee\u5f55\"))\nimport res_rc\n<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"classic\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"true\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"spliter.py\" data-enlighter-group=\"GifSpliter\"># \u7528\u4e8e\u5b9a\u4e49gif\u5206\u5272\u7a0b\u5e8f\nimport os\nimport imageio\n\n\nclass GifSplitter:\n    def __init__(self, gif_file):\n        self.gif_file = gif_file\n        self.gif = imageio.get_reader(gif_file)\n\n    def get_gif_info(self):\n        \"\"\"\u83b7\u53d6gif\u4fe1\u606f\"\"\"\n        info = {}\n        info['file_name'] = os.path.basename(self.gif_file)\n        info['folder_path'] = os.path.dirname(self.gif_file)\n        info['total_frames'] = len(self.gif)\n        return info\n\n    def export_frames(self, save_folder=None):\n        \"\"\"\u5bfc\u51fagif\u6240\u6709\u5e27\u4e3apng\u56fe\u7247\"\"\"\n        if save_folder is None:\n            save_folder = os.path.join(self.get_gif_info()['folder_path'],\n                                       'splitted')\n            if not os.path.exists(save_folder):\n                os.mkdir(save_folder)\n\n        for i, frame in enumerate(self.gif):\n            imageio.imsave(os.path.join(save_folder, '{}-{:03d}.png'.format(\n                self.get_gif_info()['file_name'], i)), frame)\n        print(f'\u5b8c\u6210\u5206\u5272: \"{(os.path.basename(self.gif_file))}\" | \u8f93\u51fa\u6587\u4ef6\u5939-->\"{save_folder}\"')\n\n\n    @classmethod\n    def split_gifs_in_folder(cls, folder_path, save_folder=None):\n        \"\"\"\u5206\u5272\u6587\u4ef6\u5939\u5185\u6240\u6709\u7684gif\u6587\u4ef6\"\"\"\n        print(f'\u62d6\u62fd\u6587\u4ef6\u5939\u4e3a\uff1a\"{folder_path}\"')\n        print(f'\u8f93\u51fa\u6587\u4ef6\u5939\u4e3a\uff1a\"{save_folder}\"')\n        if save_folder is None:\n            save_folder = os.path.join(folder_path, 'splitted')\n            if not os.path.exists(save_folder):\n                os.mkdir(save_folder)\n\n        gif_files = [file for file in os.listdir(folder_path)\n                     if file.endswith('.gif')]\n\n        i = 1\n        for gif_file in gif_files:\n            gif_splitter = cls(os.path.join(folder_path, gif_file))\n            gif_splitter.export_frames(save_folder)\n            print(f'\u6587\u4ef6\u5939\u5904\u7406\u8fdb\u5ea6: {i}\/{len(gif_files)}')\n            i = i + 1\n\nif __name__ == '__main__':\n    # \u5206\u5272\u5355\u4e2agif\u6587\u4ef6\n    gif_splitter = GifSplitter('test.gif')\n    gif_splitter.export_frames(save_folder=\"gif\")\n\n    # \u5206\u5272\u6587\u4ef6\u5939\u5185\u6240\u6709gif\u6587\u4ef6\n    GifSplitter.split_gifs_in_folder('gif_folder')<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u201cGifSpliter\u201d GIF\u5206\u5272\u5668 \u7528PyQt5\u91cd\u5199\u4e86\u4e00\u4e2a\u201cGIF\u5206\u5272\u5668\u201d\u7684\u5c0f\u5e94\u7528\uff1a \u529f\u80fd\uff1a \u73b0\u6210\u7684\u8f6f\u4ef6  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,7,30,40],"tags":[],"class_list":["post-549","post","type-post","status-publish","format-standard","hentry","category-python","category-techblog","category-30","category-40"],"_links":{"self":[{"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/posts\/549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=549"}],"version-history":[{"count":4,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/posts\/549\/revisions"}],"predecessor-version":[{"id":689,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=\/wp\/v2\/posts\/549\/revisions\/689"}],"wp:attachment":[{"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guagefangzhen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}