{ "info": { "author": "eight", "author_email": "eight04@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: Chinese (Traditional)", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Multimedia :: Graphics :: Graphics Conversion" ], "description": "pyAPNG\n======\n\n.. image:: https://travis-ci.org/eight04/pyAPNG.svg?branch=master\n :target: https://travis-ci.org/eight04/pyAPNG\n\n.. image:: https://readthedocs.org/projects/pyapng/badge/?version=latest\n :target: http://pyapng.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nA Python module to deal with APNG file.\n\nFeatures\n--------\n\n- Merge multiple images into one APNG file. (It use Pillow to convert images into PNG format)\n- Read APNG file and extract each frames into PNG file.\n- It doesn't do any optimization but only concat the images. This might be changed in the future.\n\nDependencies\n------------\n\n- `Pillow `__ - **Optional**. You can still use pyAPNG without PIL but it can only read PNG files.\n\nDevelopment dependencies\n------------------------\n\n- `pngcheck `_\n- See requirements.txt for other dev-dependencies.\n\nInstallation\n------------\n\nFrom `pypi `__::\n\n pip install apng\n\nUsage\n-----\n\nConvert a series of images into APNG animation:\n\n.. code:: python\n\n from apng import APNG\n\n APNG.from_files([\"1.jpg\", \"2.jpg\", \"3.jpg\"], delay=100).save(\"result.png\")\n\nUse different delays:\n\n.. code:: python\n\n from apng import APNG\n\n files = [\n (\"1.jpg\", 100),\n (\"2.jpg\", 200),\n (\"3.jpg\", 300)\n ]\n\n im = APNG()\n for file, delay in files:\n im.append_file(file, delay=delay)\n im.save(\"result.png\")\n\nExtract frames from an APNG file:\n\n.. code:: python\n\n from apng import APNG\n\n im = APNG.open(\"animation.png\")\n for i, (png, control) in enumerate(im.frames):\n png.save(\"{i}.png\".format(i=i))\n\nAdd a text chunk to the PNG file:\n\n.. code:: python\n\n from apng import PNG, make_text_chunk\n\n im = PNG.open(\"image.png\")\n im.chunks.append(make_text_chunk(key=\"Comment\", value=\"Some text\"))\n im.save(\"image.png\")\n\nPerformance\n-----------\n\nIf you want to convert some large JPGs into animation, the library has to convert your JPGs into PNGs then merge them into a single animation APNG file. The problems are:\n\n1. It is extremely slow.\n2. The file size of the APNG is extremely large. Probably 5x of the original or more.\n\nIn this case, I suggest trying an animation format called \"ugoira\", which is implemented by Pixiv.net. There is also an image viewer named \"HoneyView\" which can view it locally.\n\nDocument\n---------\n\nhttp://pyapng.readthedocs.io/en/latest/\n\nTodos\n-----\n\n- Add optimizer?\n\nChangelog\n---------\n\n- 0.3.3 (Feb 11, 2019)\n\n - Fix: failed to extract frames containing multiple ``fdAT`` chunks.\n\n- 0.3.2 (Jul 20, 2018)\n\n - Add: ``make_text_chunk`` function.\n - Add: ``Chunk`` data class.\n - Change: now ``parse_chunks`` yields ``Chunk`` instead of a tuple. This should be safe since ``Chunk`` is a namedtuple.\n\n- 0.3.1 (May 13, 2018)\n\n - Add: universal wheel.\n\n- 0.3.0 (May 13, 2018)\n\n - Support Python 2.\n - Add: PNG method ``open_any``, ``from_bytes``.\n - Add: APNG method ``append_file``, ``from_bytes``.\n - Add: module function ``parse_chunks``.\n - **Drop: module function `is_png` and `chunks`.**\n - **Change: `PNG.open` now only reads PNG images. To read non-PNG images, use `PNG.open_any`.**\n - **Change: `APNG.append` now only accepts `PNG` instance. To append PNG files, use `APNG.append_file`.**\n\n- 0.2.1 (Apr 19, 2018)\n\n - Add: support num_plays. (`#4 `_)\n\n- 0.2.0 (Dec 8, 2017)\n\n - Add test.\n - Add documents.\n - Add: support path-like object.\n - Fix: some chunks must appear before IDAT. (`#1 `_)\n - Fix: change chunks order in APNG. Some chunks are moved to the end of the file.\n - Fix: remove tRNS hack.\n - Fix: is_png shouldn't move file pointer. (`#2 `_)\n\n- 0.1.0 (May 30, 2016)\n\n - First release.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/eight04/pyAPNG", "keywords": "png,apng,image,convert", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "apng", "package_url": "https://pypi.org/project/apng/", "platform": "", "project_url": "https://pypi.org/project/apng/", "project_urls": { "Homepage": "https://github.com/eight04/pyAPNG" }, "release_url": "https://pypi.org/project/apng/0.3.3/", "requires_dist": null, "requires_python": "", "summary": "A Python module to deal with APNG file.", "version": "0.3.3" }, "last_serial": 4803572, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "372a13efc2f43e7d092058657782ca8b", "sha256": "34b59c20a79405b0d52acbf2f6cd4a6848c3b2d0ca53f15b9028ea2ad0724f24" }, "downloads": -1, "filename": "apng-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "372a13efc2f43e7d092058657782ca8b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5970, "upload_time": "2016-05-29T18:39:14", "url": "https://files.pythonhosted.org/packages/c1/b6/55c7d7d06d2a6c8ce0321649b4c645de6c905945ef06228e0b40f50da288/apng-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2807d828e7d75e7eee5797e2ce6e6572", "sha256": "cece63c3f29e51233028f543b56e7824a40ea0fbb1f2353eba3418037d7be787" }, "downloads": -1, "filename": "apng-0.1.0.zip", "has_sig": false, "md5_digest": "2807d828e7d75e7eee5797e2ce6e6572", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7220, "upload_time": "2016-05-29T18:39:20", "url": "https://files.pythonhosted.org/packages/55/7d/5822d28696fd16b57186fd669f6fe31983f4a550b0deda4722cef4b60383/apng-0.1.0.zip" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "04985024646f434527633e14902a45c7", "sha256": "24ea68997216f00c3a80ee038793eb4f59b3afbab0bbb44da8c40d3780910579" }, "downloads": -1, "filename": "apng-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "04985024646f434527633e14902a45c7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7562, "upload_time": "2017-12-07T22:13:08", "url": "https://files.pythonhosted.org/packages/27/23/afa827d07fdde7133a42cad6da0c609647b3fddaa72049b4ff088a06aaed/apng-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc9b6addf9e78d4a0ba2ef5d3da08b30", "sha256": "9c4bf2032eab606296d7584ecf5246b20f0aba2ebb675962b6b8ba1abc532b44" }, "downloads": -1, "filename": "apng-0.2.0.tar.gz", "has_sig": false, "md5_digest": "dc9b6addf9e78d4a0ba2ef5d3da08b30", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5478, "upload_time": "2017-12-07T22:13:10", "url": "https://files.pythonhosted.org/packages/db/2d/b262d4d648e39edd5a23ad8cf2a4136fe8061d285b70f18c4536d6b1299f/apng-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "c1132c436f9b36d3e9fc26c13b1e7a24", "sha256": "dcb36a26fa0cbda556139f5cce94ad1755c2e474f4926d4a312da573eab1d998" }, "downloads": -1, "filename": "apng-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c1132c436f9b36d3e9fc26c13b1e7a24", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7708, "upload_time": "2018-04-19T11:06:45", "url": "https://files.pythonhosted.org/packages/ac/62/4455c583c541d93afee6ff2804b73786952822fdf3ef16eeaeff1f609620/apng-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "397a6f73669c624c8b6f9ae93d42591f", "sha256": "b075c90500b8d070b231a6dc215d468f93a06ebcb8840ae181160ec1cbe04263" }, "downloads": -1, "filename": "apng-0.2.1.tar.gz", "has_sig": false, "md5_digest": "397a6f73669c624c8b6f9ae93d42591f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5605, "upload_time": "2018-04-19T11:06:46", "url": "https://files.pythonhosted.org/packages/21/0b/4bd34b7d0b2e50b69407af40371fb92608fc064eae60bc47575293838191/apng-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "6ff2064368008c151d341b4d8a9f78ae", "sha256": "a7360a7742e8e015f8d013ff6ed62b57aa222511ad7082c2a7a1e54a6b4f5956" }, "downloads": -1, "filename": "apng-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6ff2064368008c151d341b4d8a9f78ae", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8739, "upload_time": "2018-05-12T19:47:46", "url": "https://files.pythonhosted.org/packages/dc/de/6db7d12a433a1e59b9dd4d031ae21a033d98102425caad30a6503dbeff12/apng-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bf54228898a3ceacd299d17fa49d9a93", "sha256": "7135fa087aef0353e02ae90af272fcea8e8e27f1f7a313576359ed3b29aee0fe" }, "downloads": -1, "filename": "apng-0.3.0.tar.gz", "has_sig": false, "md5_digest": "bf54228898a3ceacd299d17fa49d9a93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6263, "upload_time": "2018-05-12T19:47:48", "url": "https://files.pythonhosted.org/packages/f8/13/4cc663ccd845f38fb2c51a22aa9aefcc27d5f06bf08763c201d19fd70d4f/apng-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "81a09725f7e374a169c381a5dc5c626c", "sha256": "4a2fe781fb01b1338c5112392c0d3f67c569803dadbede47efc975a42b95cf85" }, "downloads": -1, "filename": "apng-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "81a09725f7e374a169c381a5dc5c626c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8774, "upload_time": "2018-05-12T19:54:45", "url": "https://files.pythonhosted.org/packages/6c/2b/c994ccd4a3ad5fb055279292f8f1be8fa6d172e144fcc9f2a2a2004de5e9/apng-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b6c799b63b30e7fa2d7f47de1dcc7a4", "sha256": "de718ed4cdf9ed1deee060db82d9e1980f3345fa88beedd7ce8d027371ee5db9" }, "downloads": -1, "filename": "apng-0.3.1.tar.gz", "has_sig": false, "md5_digest": "3b6c799b63b30e7fa2d7f47de1dcc7a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6267, "upload_time": "2018-05-12T19:54:46", "url": "https://files.pythonhosted.org/packages/84/7f/e14e781da9e3f7a9b1fa15f1be11e4f94d5964397d26957ab8ac33e2ec36/apng-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "2b6c62b9f56bb240e8a3a11632304daa", "sha256": "f70b50a7fd3a3b92577794e7acb496b9337a9e2130801e944b7e455ab05374c7" }, "downloads": -1, "filename": "apng-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2b6c62b9f56bb240e8a3a11632304daa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9726, "upload_time": "2018-07-20T09:12:45", "url": "https://files.pythonhosted.org/packages/9f/17/7b3d221b5194260cd864fa214d9084a466c258ca783c7063182d82c22239/apng-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a3f77e4d9efff63e3195b08f6e7bc3a", "sha256": "d56a8d6cfa00214cd4f3d064ce771c437043373d501a730ad3e8d9ced6ac7ce5" }, "downloads": -1, "filename": "apng-0.3.2.tar.gz", "has_sig": false, "md5_digest": "2a3f77e4d9efff63e3195b08f6e7bc3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8115, "upload_time": "2018-07-20T09:12:47", "url": "https://files.pythonhosted.org/packages/83/c9/03a5657b09df23d72d133d038271bc8cfea95fa9b61691aa75310aee2aaf/apng-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "fc44ca2a75ddf87b5801af633b21f184", "sha256": "0ab31016a93fd506daa50a84592bb9e4c7ce07449228a445d3a856944fae2711" }, "downloads": -1, "filename": "apng-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fc44ca2a75ddf87b5801af633b21f184", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9752, "upload_time": "2019-02-10T23:12:22", "url": "https://files.pythonhosted.org/packages/7b/75/261c53288e91d978f4bd9066a73ddcb4cfb047b8d3a21e6255889eb7deae/apng-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df71069116768de72a14ea1782d8a890", "sha256": "0871654d8bba9280ad5ec3446c29174b241b578777ea14bf02f2f4d5a193738b" }, "downloads": -1, "filename": "apng-0.3.3.tar.gz", "has_sig": false, "md5_digest": "df71069116768de72a14ea1782d8a890", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8180, "upload_time": "2019-02-10T23:12:24", "url": "https://files.pythonhosted.org/packages/be/2e/2f9d9893370311ec79229c893bb63bebd5d95ded17cad5f14751f64575e7/apng-0.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fc44ca2a75ddf87b5801af633b21f184", "sha256": "0ab31016a93fd506daa50a84592bb9e4c7ce07449228a445d3a856944fae2711" }, "downloads": -1, "filename": "apng-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fc44ca2a75ddf87b5801af633b21f184", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 9752, "upload_time": "2019-02-10T23:12:22", "url": "https://files.pythonhosted.org/packages/7b/75/261c53288e91d978f4bd9066a73ddcb4cfb047b8d3a21e6255889eb7deae/apng-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df71069116768de72a14ea1782d8a890", "sha256": "0871654d8bba9280ad5ec3446c29174b241b578777ea14bf02f2f4d5a193738b" }, "downloads": -1, "filename": "apng-0.3.3.tar.gz", "has_sig": false, "md5_digest": "df71069116768de72a14ea1782d8a890", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8180, "upload_time": "2019-02-10T23:12:24", "url": "https://files.pythonhosted.org/packages/be/2e/2f9d9893370311ec79229c893bb63bebd5d95ded17cad5f14751f64575e7/apng-0.3.3.tar.gz" } ] }