{"id":4014,"date":"2020-10-26T15:29:59","date_gmt":"2020-10-26T20:29:59","guid":{"rendered":"https:\/\/www.logikalsolutions.com\/wordpress\/?p=4014"},"modified":"2021-02-14T13:55:45","modified_gmt":"2021-02-14T19:55:45","slug":"splitting-animated-gif","status":"publish","type":"post","link":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/","title":{"rendered":"CopperSpice Experiments &#8211; Pt. 17"},"content":{"rendered":"\n<p>I&#8217;m putting this here because I discovered it while trying to fix a rather horrible &#8220;busy&#8221; dialog in the Advanced Search portion of Diamond. I had to create a GUI &#8220;Hello World&#8221; application to test this out so I could file a &#8220;simple&#8221; bug report. According to the doc animated GIF is supported on all platforms. The code for Linux is a tad behind the documentation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp line-numbers\">#include &lt;QApplication&gt;\n#include \"mainwindow.h\"\n\nint main( int argc, char *argv[] )\n{\n    QApplication a( argc, argv );\n\n    MainWindow *mw = new MainWindow();\n\n    mw-&gt;show();\n\n    return a.exec();\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp line-numbers\">#include &lt;QMainWindow&gt;\n#include &lt;QMainWindow&gt;\n#include &lt;QLabel&gt;\n#include &lt;QVBoxLayout&gt;\n#include &lt;QMovie&gt;\n#include &lt;QByteArray&gt;\n\nclass MainWindow : public QMainWindow\n{\n    CS_OBJECT( MainWindow )\npublic:\n    MainWindow( QWidget *parent=0 );\n    ~MainWindow();\n\nprivate:\n\n    QLabel         *m_hello;\n    QLabel         *m_movieLabel;\n    QVBoxLayout    *m_layout;\n    QWidget        *m_widget;\n    QMovie         *m_movie;\n\n};<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include \"mainwindow.h\"\n\nMainWindow::MainWindow( QWidget *parent ) :\n    QMainWindow( parent )\n{\n    qDebug() &lt;&lt; \"supported formats: \" &lt;&lt; QMovie::supportedFormats();\n\n    m_hello         = new QLabel( \"Hello World!\" );\n    m_movieLabel    = new QLabel();\n    m_movie         = new QMovie( \":\/\/animations\/spinning-red-diamond-4.gif\" );\n    m_layout        = new QVBoxLayout();\n    m_widget        = new QWidget();\n\n    m_movieLabel-&gt;setMovie( m_movie );\n\n    m_layout-&gt;addWidget( m_hello );\n    m_layout-&gt;addWidget( m_movieLabel );\n\n    m_widget-&gt;setLayout( m_layout );\n\n    setCentralWidget( m_widget );\n}\n\nMainWindow::~MainWindow()\n{\n    delete m_widget;\n    delete m_layout;\n    \/\/delete m_movie;\n    \/\/delete m_movieLabel;\n    \/\/delete m_hello;\n}<\/code><\/pre>\n\n\n\n<p>When I build and run this on Ubuntu 20.04 LTS I see the following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"730\" height=\"330\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-14-58-14.png\" alt=\"\" class=\"wp-image-4015\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-14-58-14.png 730w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-14-58-14-300x136.png 300w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><figcaption>No supported formats<\/figcaption><\/figure>\n\n\n\n<p>A sad sad day indeed.<\/p>\n\n\n\n<p>What this means is the cool animated GIF <a href=\"https:\/\/icons8.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Icons8<\/a> let me create now has to be busted up into frames. Well fine. I just didn&#8217;t have anything to do that installed on this system and didn&#8217;t want to take the time to learn how to do it in some graphics package because the odds of me having to do it again were slim to none. <\/p>\n\n\n\n<p>A bit of Web searching turned up a <a href=\"https:\/\/ezgif.com\/split\" target=\"_blank\" rel=\"noreferrer noopener\">really cool site<\/a>. I didn&#8217;t bother to read any of their retention policy, etc. because this was something OpenSource I generated at Icons8. If you have some trade secret images then you have to read that or not use the site.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"837\" height=\"464\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-03-36.png\" alt=\"\" class=\"wp-image-4016\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-03-36.png 837w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-03-36-300x166.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-03-36-768x426.png 768w\" sizes=\"(max-width: 837px) 100vw, 837px\" \/><figcaption>ezgif.com<\/figcaption><\/figure>\n\n\n\n<p>Once you upload you choose your split options and apparently can do other things.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"826\" height=\"403\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-05-39.png\" alt=\"\" class=\"wp-image-4017\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-05-39.png 826w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-05-39-300x146.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-05-39-768x375.png 768w\" sizes=\"(max-width: 826px) 100vw, 826px\" \/><figcaption>after upload<\/figcaption><\/figure>\n\n\n\n<p>Once you click the split button you are quickly greeted with the following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"832\" height=\"674\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-06-50.png\" alt=\"\" class=\"wp-image-4018\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-06-50.png 832w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-06-50-300x243.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-06-50-768x622.png 768w\" sizes=\"(max-width: 832px) 100vw, 832px\" \/><figcaption>After split<\/figcaption><\/figure>\n\n\n\n<p>What is really cool is how they name the files inside of the zip.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"241\" height=\"438\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-08-16.png\" alt=\"\" class=\"wp-image-4019\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-08-16.png 241w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-08-16-165x300.png 165w\" sizes=\"(max-width: 241px) 100vw, 241px\" \/><figcaption>files inside of zip<\/figcaption><\/figure>\n\n\n\n<p>They provide you the decimal number of seconds for each frame. This means you can easily set up your millisecond driven timer. If your brain happens to be too thick to slide the decimal on its own you can just key in<\/p>\n\n\n\n<p>milliseconds to seconds<\/p>\n\n\n\n<p>for the DuckDuckGo search term and you are greeted with:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"806\" height=\"342\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-10-10.png\" alt=\"\" class=\"wp-image-4020\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-10-10.png 806w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-10-10-300x127.png 300w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-10-10-768x326.png 768w\" sizes=\"(max-width: 806px) 100vw, 806px\" \/><figcaption>converter<\/figcaption><\/figure>\n\n\n\n<p>So, I unzipped into a directory I created called image-work-4. Now I need to fix the file names. I want to get rid of the delay time and prepend &#8220;red_diamond_&#8221;. In a terminal I cd to the directory and type the following:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">rename 's\/_delay-0.11s\/\/;' *<\/code><\/pre>\n\n\n\n<p>This leaves me with a bunch of frame_nn.gif files. There are probably cleaner ways to do the prepend, but here is what I did.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">find -L . -type f -name \"*.gif\" -exec bash -c 'echo \"mv $0\" \"${0%\/*}\/red_diamond_${0##*\/}\"' {} \\;<\/code><\/pre>\n\n\n\n<p>That outputs a list of mv commands having both file names with .\/ in front of them. I didn&#8217;t even try to see if that would work. I just screen scraped them into an editor and replace &#8220;.\/&#8221; with &#8220;&#8221; then scraped the lines from the editor and pasted them into the terminal. After creating a directory underneath my project resources directory I copied in the files.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"711\" height=\"131\" src=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-17-09.png\" alt=\"\" class=\"wp-image-4021\" srcset=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-17-09.png 711w, https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/Screenshot-from-2020-10-26-15-17-09-300x55.png 300w\" sizes=\"(max-width: 711px) 100vw, 711px\" \/><figcaption>the files<\/figcaption><\/figure>\n\n\n\n<p>Honestly I&#8217;m created this post because I want to remember the commands. No, rename isn&#8217;t a built-in Linux command. It is in the Ubuntu repositories though. That&#8217;s a command line ability not all platforms have.<\/p>\n\n\n\n<p>Why am I doing this?<\/p>\n\n\n\n<p>I want to finish this phase of the project. Creating your own animation out of a series of images is very old school. I&#8217;ve done it with earlier versions of Qt and even Zinc. It&#8217;s actually mandatory on systems without a GPU because most graphics libraries supporting animation require a GPU be present. All you need to know is the value to put in the timer. Every time it fires you move to the next image in the list. After the last image you go back to the first.<\/p>\n\n\n\n<p>When you need to both block the UI and perform a potentially long running task, you toss up a modal dialog with some kind of QFuture or other thread mechanism. Ideally your dialog is frameless with a transparent background so it looks like just your animation is there. When your threaded task ends you connect its ending to the removal of the dialog. Don&#8217;t forget to kill off your timer.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/memory-leaks\/\">&lt;Previous-part<\/a>    <a href=\"https:\/\/www.logikalsolutions.com\/wordpress\/information-technology\/diamond-editor-pull-request\/\">Next-part><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m putting this here because I discovered it while trying to fix a rather horrible &#8220;busy&#8221; dialog in the Advanced Search portion of Diamond. I had to create a GUI &#8220;Hello World&#8221; application to test this out so I could file a &#8220;simple&#8221; bug report. According to the doc animated GIF is supported on all platforms. The code for Linux is a tad behind the documentation. When I build and run this on Ubuntu 20.04 &hellip; <a title=\"CopperSpice Experiments &#8211; Pt. 17\" class=\"bnm-read-more\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/\"><span class=\"screen-reader-text\">CopperSpice Experiments &#8211; Pt. 17<\/span>Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":3939,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[1866,1835,1836],"class_list":["post-4014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-animated-gif","tag-copperspice","tag-diamond","bnm-entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog<\/title>\n<meta name=\"description\" content=\"When QMovie doesn&#039;t support your animated GIF, don&#039;t lose up. You can split the GIF into images and rotate through them yourself.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog\" \/>\n<meta property=\"og:description\" content=\"When QMovie doesn&#039;t support your animated GIF, don&#039;t lose up. You can split the GIF into images and rotate through them yourself.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/\" \/>\n<meta property=\"og:site_name\" content=\"Logikal Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-10-26T20:29:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-02-14T19:55:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"64\" \/>\n\t<meta property=\"og:image:height\" content=\"64\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"seasoned_geek\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"seasoned_geek\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/\"},\"author\":{\"name\":\"seasoned_geek\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"headline\":\"CopperSpice Experiments &#8211; Pt. 17\",\"datePublished\":\"2020-10-26T20:29:59+00:00\",\"dateModified\":\"2021-02-14T19:55:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/\"},\"wordCount\":660,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/spinning-red-diamond-4.gif\",\"keywords\":[\"animated gif\",\"CopperSpice\",\"Diamond\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/\",\"name\":\"CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/spinning-red-diamond-4.gif\",\"datePublished\":\"2020-10-26T20:29:59+00:00\",\"dateModified\":\"2021-02-14T19:55:45+00:00\",\"description\":\"When QMovie doesn't support your animated GIF, don't lose up. You can split the GIF into images and rotate through them yourself.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/spinning-red-diamond-4.gif\",\"contentUrl\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/spinning-red-diamond-4.gif\",\"width\":64,\"height\":64},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/uncategorized\\\/splitting-animated-gif\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CopperSpice Experiments &#8211; Pt. 17\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/\",\"name\":\"Logikal Blog\",\"description\":\"For people with attention spans longer than a Tweet\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/#\\\/schema\\\/person\\\/c077f770ade13de7faaf616c3eac6842\",\"name\":\"seasoned_geek\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\",\"caption\":\"seasoned_geek\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r\"},\"description\":\"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\\\/Qt touchscreen\\\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \\\"Zinc It!\\\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \\\"The Minimum You Need to Know to Be an OpenVMS Application Developer\\\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \\\"The Minimum You Need to Know\\\" book series was born. Three years later he wrote his first novel \\\"Infinite Exposure\\\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \\\"The Earth That Was\\\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.\",\"sameAs\":[\"https:\\\/\\\/theminimumyouneedtoknow.com\"],\"url\":\"https:\\\/\\\/www.logikalsolutions.com\\\/wordpress\\\/author\\\/seasoned_geek\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog","description":"When QMovie doesn't support your animated GIF, don't lose up. You can split the GIF into images and rotate through them yourself.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/","og_locale":"en_US","og_type":"article","og_title":"CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog","og_description":"When QMovie doesn't support your animated GIF, don't lose up. You can split the GIF into images and rotate through them yourself.","og_url":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/","og_site_name":"Logikal Blog","article_published_time":"2020-10-26T20:29:59+00:00","article_modified_time":"2021-02-14T19:55:45+00:00","og_image":[{"width":64,"height":64,"url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif","type":"image\/gif"}],"author":"seasoned_geek","twitter_card":"summary_large_image","twitter_misc":{"Written by":"seasoned_geek","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#article","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/"},"author":{"name":"seasoned_geek","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"headline":"CopperSpice Experiments &#8211; Pt. 17","datePublished":"2020-10-26T20:29:59+00:00","dateModified":"2021-02-14T19:55:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/"},"wordCount":660,"commentCount":0,"publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif","keywords":["animated gif","CopperSpice","Diamond"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/","url":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/","name":"CopperSpice Experiments - Pt. 17 &#8211; Logikal Blog","isPartOf":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#primaryimage"},"image":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#primaryimage"},"thumbnailUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif","datePublished":"2020-10-26T20:29:59+00:00","dateModified":"2021-02-14T19:55:45+00:00","description":"When QMovie doesn't support your animated GIF, don't lose up. You can split the GIF into images and rotate through them yourself.","breadcrumb":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#primaryimage","url":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif","contentUrl":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-content\/uploads\/2020\/10\/spinning-red-diamond-4.gif","width":64,"height":64},{"@type":"BreadcrumbList","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/uncategorized\/splitting-animated-gif\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.logikalsolutions.com\/wordpress\/"},{"@type":"ListItem","position":2,"name":"CopperSpice Experiments &#8211; Pt. 17"}]},{"@type":"WebSite","@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#website","url":"https:\/\/www.logikalsolutions.com\/wordpress\/","name":"Logikal Blog","description":"For people with attention spans longer than a Tweet","publisher":{"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.logikalsolutions.com\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.logikalsolutions.com\/wordpress\/#\/schema\/person\/c077f770ade13de7faaf616c3eac6842","name":"seasoned_geek","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","url":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r","caption":"seasoned_geek"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/ae9adac14079d84b909e635d7af986fe4568053af4fd9ff8d4109298c392493e?s=96&d=mm&r=r"},"description":"Roland Hughes started his IT career in the early 1980s. He quickly became a consultant and president of Logikal Solutions, a software consulting firm specializing in OpenVMS application and C++\/Qt touchscreen\/embedded Linux development. Early in his career he became involved in what is now called cross platform development. Given the dearth of useful books on the subject he ventured into the world of professional author in 1995 writing the first of the \"Zinc It!\" book series for John Gordon Burke Publisher, Inc. A decade later he released a massive (nearly 800 pages) tome \"The Minimum You Need to Know to Be an OpenVMS Application Developer\" which tried to encapsulate the essential skills gained over what was nearly a 20 year career at that point. From there \"The Minimum You Need to Know\" book series was born. Three years later he wrote his first novel \"Infinite Exposure\" which got much notice from people involved in the banking and financial security worlds. Some of the attacks predicted in that book have since come to pass. While it was not originally intended to be a trilogy, it became the first book of \"The Earth That Was\" trilogy: Infinite Exposure Lesedi - The Greatest Lie Ever Told John Smith - Last Known Survivor of the Microsoft Wars When he is not consulting Roland Hughes posts about technology and sometimes politics on his blog. He also has regularly scheduled Sunday posts appearing on the Interesting Authors blog.","sameAs":["https:\/\/theminimumyouneedtoknow.com"],"url":"https:\/\/www.logikalsolutions.com\/wordpress\/author\/seasoned_geek\/"}]}},"_links":{"self":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/4014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/comments?post=4014"}],"version-history":[{"count":0,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/posts\/4014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media\/3939"}],"wp:attachment":[{"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/media?parent=4014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/categories?post=4014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.logikalsolutions.com\/wordpress\/wp-json\/wp\/v2\/tags?post=4014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}