Results 1 to 5 of 5

Thread: QImage getting black areas for GIF frames

  1. #1
    Join Date
    Dec 2013
    Posts
    3
    Thanked 3 Times in 3 Posts
    Qt products
    Qt5
    Platforms
    Unix/X11

    Question QImage getting black areas for GIF frames

    I'm using a simple QImage program to look at frames from GIF animations. Occasionally the output image is corrupted, with black areas appearing over it. I have tried doing a simple export of the frames to files, in JPG, PNG, and GIF format and the results are the same. I've also verified the black areas are not transparency (although I've no idea how to set this in Qt if that were the case).

    This is the relevant code:

    QImage* image = new QImage();
    QImageReader* reader = new QImageReader(gif);
    reader->read(image);

    for(int index=0;index<=reader->imageCount();index++)
    {
    reader->jumpToNextImage();
    reader->read(image);
    QString frameName = dir + '/' + QString("out%1.jpg").arg(index,5,10,QChar('0'));
    image->save(frameName,"JPEG",100);
    }
    So I'm wondering if this is a known issue or if anyone else has encountered this? Or perhaps there are some changes required for certain colourspaces or something else I am not considering.

  2. The following user says thank you to elephant for this useful post:

    talbertypeter (7th December 2013)

  3. #2
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Wiki edits
    17

    Default Re: QImage getting black areas for GIF frames

    If memory serves GIF animations can be a base image followed by a series of difference images. Are you perhaps seeing only the differences from the preceding frame? Can you post a link to an example image that does this?

  4. The following user says thank you to ChrisW67 for this useful post:

    talbertypeter (7th December 2013)

  5. #3
    Join Date
    Dec 2013
    Posts
    3
    Thanked 3 Times in 3 Posts
    Qt products
    Qt5
    Platforms
    Unix/X11

    Default Re: QImage getting black areas for GIF frames

    Yes, that is correct. The frames can call a disposal method and if the underlying frames are transparent (or of different dimensions) then you would see the spaces in the raw frame. Imagemagick uses a "coalesce" option to collapse each frame into what the viewer would see. I do not know if QImage has an option to change its behaviour, but it does this by default (which is what I want).

    I also looked at the frames as dumped out by Imagemagick (without coalesce) and these frames did not have transparency. Actually almost all animated gifs use this trick, and 95% of them work with the QImage libary (many times faster than Imagemagick too!)

  6. The following user says thank you to elephant for this useful post:

    talbertypeter (7th December 2013)

  7. #4
    Join Date
    Mar 2009
    Location
    Brisbane, Australia
    Posts
    7,729
    Thanks
    13
    Thanked 1,610 Times in 1,537 Posts
    Qt products
    Qt4 Qt5
    Platforms
    Unix/X11 Windows
    Wiki edits
    17

    Default Re: QImage getting black areas for GIF frames

    Your code reads an image imageCount() + 2 times. I expect the last two images are the problem children.
    Qt Code:
    1. QImage* image = new QImage();
    2. QImageReader* reader = new QImageReader(gif);
    3. reader->read(image);
    4.  
    5. for(int index=0;index<=reader->imageCount();index++)
    6. {
    7. reader->jumpToNextImage();
    8. reader->read(image);
    9. QString frameName = dir + '/' + QString("out%1.jpg").arg(index,5,10,QChar('0'));
    10. image->save(frameName,"JPEG",100);
    11. }
    To copy to clipboard, switch view to plain text mode 
    Line 3: reads first image in file (discarded)
    Line 5: Loop of imageCount() + 1 iterations
    Line 7: index == 0, jump to second image in file. index == 1, jump to third image...
    Line 8: returns false (ignored) on last two loops

    Try this on your problem image
    Qt Code:
    1. const QString gif("test.gif");
    2. QImage image;
    3. QImageReader reader(gif);
    4. qDebug() << "Count =" << reader.imageCount();
    5. for (int index = 0; index < reader.imageCount(); ++index) {
    6. if (reader.read(&image))
    7. image.save(QString("output%1.png").arg(index, 3, 10, QLatin1Char('0')));
    8. }
    To copy to clipboard, switch view to plain text mode 

  8. The following user says thank you to ChrisW67 for this useful post:

    talbertypeter (7th December 2013)

  9. #5
    Join Date
    Dec 2013
    Posts
    3
    Thanked 3 Times in 3 Posts
    Qt products
    Qt5
    Platforms
    Unix/X11

    Default Re: QImage getting black areas for GIF frames

    No I think that error was just introduced in the code to extract the images to a file for tests.

    However, I did look more closely and the problem is the disposal method "Previous".

    For examples see this page: http://www.imagemagick.org/Usage/anim_basics/#previous

    Using your code with the example gif with disposal method "None" (http://www.imagemagick.org/Usage/ani...anvas_none.gif), frame #3 includes frame 2,1 and 0 all on top of one another. This is correct.

    Using the gif with disposal method "Previous" (http://www.imagemagick.org/Usage/ani...anvas_prev.gif) frame #3 includes frame 2 and 1, but does NOT include frame 0. This is not correct.

    I guess as a side question, does anyone know if there are options for how qt handles the disposal method?

  10. The following user says thank you to elephant for this useful post:

    talbertypeter (7th December 2013)

Similar Threads

  1. Replies: 8
    Last Post: 13th May 2013, 14:36
  2. Dock widget allowed areas in QMainWindow
    By jpalbertini in forum Qt Programming
    Replies: 0
    Last Post: 28th January 2013, 11:36
  3. Replies: 2
    Last Post: 10th June 2011, 14:16
  4. How to make certain areas transparent with the desktop?
    By Sir Rogers in forum Qt Programming
    Replies: 5
    Last Post: 11th May 2010, 22:08
  5. QGraphicsView and adding QWidget with transparent areas
    By sting73 in forum Qt Programming
    Replies: 2
    Last Post: 28th April 2009, 11:19

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Digia, Qt and their respective logos are trademarks of Digia Plc in Finland and/or other countries worldwide.