src/gui/image/qimagewriter.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /*!
       
    43     \class QImageWriter
       
    44     \brief The QImageWriter class provides a format independent interface
       
    45     for writing images to files or other devices.
       
    46 
       
    47     \reentrant
       
    48     \ingroup painting
       
    49     \ingroup io
       
    50 
       
    51     QImageWriter supports setting format specific options, such as the
       
    52     gamma level, compression level and quality, prior to storing the
       
    53     image. If you do not need such options, you can use QImage::save()
       
    54     or QPixmap::save() instead.
       
    55 
       
    56     To store an image, you start by constructing a QImageWriter
       
    57     object.  Pass either a file name or a device pointer, and the
       
    58     image format to QImageWriter's constructor. You can then set
       
    59     several options, such as the gamma level (by calling setGamma())
       
    60     and quality (by calling setQuality()). canWrite() returns true if
       
    61     QImageWriter can write the image (i.e., the image format is
       
    62     supported and the device is open for writing). Call write() to
       
    63     write the image to the device.
       
    64 
       
    65     If any error occurs when writing the image, write() will return
       
    66     false. You can then call error() to find the type of error that
       
    67     occurred, or errorString() to get a human readable description of
       
    68     what went wrong.
       
    69 
       
    70     Call supportedImageFormats() for a list of formats that
       
    71     QImageWriter can write. QImageWriter supports all built-in image
       
    72     formats, in addition to any image format plugins that support
       
    73     writing.
       
    74 
       
    75     \sa QImageReader, QImageIOHandler, QImageIOPlugin
       
    76 */
       
    77 
       
    78 /*!
       
    79     \enum QImageWriter::ImageWriterError
       
    80 
       
    81     This enum describes errors that can occur when writing images with
       
    82     QImageWriter.
       
    83 
       
    84     \value DeviceError QImageWriter encountered a device error when
       
    85     writing the image data. Consult your device for more details on
       
    86     what went wrong.
       
    87 
       
    88     \value UnsupportedFormatError Qt does not support the requested
       
    89     image format.
       
    90 
       
    91     \value UnknownError An unknown error occurred. If you get this
       
    92     value after calling write(), it is most likely caused by a bug in
       
    93     QImageWriter.
       
    94 */
       
    95 
       
    96 #include "qimagewriter.h"
       
    97 
       
    98 #include <qbytearray.h>
       
    99 #include <qfile.h>
       
   100 #include <qfileinfo.h>
       
   101 #include <qimageiohandler.h>
       
   102 #include <qset.h>
       
   103 #include <qvariant.h>
       
   104 
       
   105 // factory loader
       
   106 #include <qcoreapplication.h>
       
   107 #include <private/qfactoryloader_p.h>
       
   108 
       
   109 // image handlers
       
   110 #include <private/qbmphandler_p.h>
       
   111 #include <private/qppmhandler_p.h>
       
   112 #include <private/qxbmhandler_p.h>
       
   113 #include <private/qxpmhandler_p.h>
       
   114 #ifndef QT_NO_IMAGEFORMAT_PNG
       
   115 #include <private/qpnghandler_p.h>
       
   116 #endif
       
   117 
       
   118 QT_BEGIN_NAMESPACE
       
   119 
       
   120 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   121 Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
       
   122                           (QImageIOHandlerFactoryInterface_iid, QLatin1String("/imageformats")))
       
   123 #endif
       
   124 
       
   125 static QImageIOHandler *createWriteHandlerHelper(QIODevice *device,
       
   126     const QByteArray &format)
       
   127 {
       
   128     QByteArray form = format.toLower();
       
   129     QByteArray suffix;
       
   130     QImageIOHandler *handler = 0;
       
   131 
       
   132 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   133     // check if any plugins can write the image
       
   134     QFactoryLoader *l = loader();
       
   135     QStringList keys = l->keys();
       
   136     int suffixPluginIndex = -1;
       
   137 #endif
       
   138 
       
   139     if (device && format.isEmpty()) {
       
   140         // if there's no format, see if \a device is a file, and if so, find
       
   141         // the file suffix and find support for that format among our plugins.
       
   142         // this allows plugins to override our built-in handlers.
       
   143         if (QFile *file = qobject_cast<QFile *>(device)) {
       
   144             if (!(suffix = QFileInfo(file->fileName()).suffix().toLower().toLatin1()).isEmpty()) {
       
   145 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   146                 int index = keys.indexOf(QString::fromLatin1(suffix));
       
   147                 if (index != -1)
       
   148                     suffixPluginIndex = index;
       
   149 #endif
       
   150             }
       
   151         }
       
   152     }
       
   153 
       
   154     QByteArray testFormat = !form.isEmpty() ? form : suffix;
       
   155 
       
   156 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   157     if (suffixPluginIndex != -1) {
       
   158         // when format is missing, check if we can find a plugin for the
       
   159         // suffix.
       
   160         QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(QString::fromLatin1(suffix)));
       
   161         if (plugin && (plugin->capabilities(device, suffix) & QImageIOPlugin::CanWrite))
       
   162             handler = plugin->create(device, suffix);
       
   163     }
       
   164 #endif // Q_NO_LIBRARY
       
   165 
       
   166     // check if any built-in handlers can write the image
       
   167     if (!handler && !testFormat.isEmpty()) {
       
   168         if (false) {
       
   169 #ifndef QT_NO_IMAGEFORMAT_PNG
       
   170         } else if (testFormat == "png") {
       
   171             handler = new QPngHandler;
       
   172 #endif
       
   173 #ifndef QT_NO_IMAGEFORMAT_BMP
       
   174         } else if (testFormat == "bmp") {
       
   175             handler = new QBmpHandler;
       
   176 #endif
       
   177 #ifndef QT_NO_IMAGEFORMAT_XPM
       
   178         } else if (testFormat == "xpm") {
       
   179             handler = new QXpmHandler;
       
   180 #endif
       
   181 #ifndef QT_NO_IMAGEFORMAT_XBM
       
   182         } else if (testFormat == "xbm") {
       
   183             handler = new QXbmHandler;
       
   184             handler->setOption(QImageIOHandler::SubType, testFormat);
       
   185 #endif
       
   186 #ifndef QT_NO_IMAGEFORMAT_PPM
       
   187         } else if (testFormat == "pbm" || testFormat == "pbmraw" || testFormat == "pgm"
       
   188                  || testFormat == "pgmraw" || testFormat == "ppm" || testFormat == "ppmraw") {
       
   189             handler = new QPpmHandler;
       
   190             handler->setOption(QImageIOHandler::SubType, testFormat);
       
   191 #endif
       
   192         }
       
   193     }
       
   194 
       
   195 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   196     if (!testFormat.isEmpty()) {
       
   197         for (int i = 0; i < keys.size(); ++i) {
       
   198             QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(keys.at(i)));
       
   199             if (plugin && (plugin->capabilities(device, testFormat) & QImageIOPlugin::CanWrite)) {
       
   200                 handler = plugin->create(device, testFormat);
       
   201                 break;
       
   202             }
       
   203         }
       
   204     }
       
   205 #endif
       
   206 
       
   207     if (!handler)
       
   208         return 0;
       
   209 
       
   210     handler->setDevice(device);
       
   211     if (!testFormat.isEmpty())
       
   212         handler->setFormat(testFormat);
       
   213     return handler;
       
   214 }
       
   215 
       
   216 class QImageWriterPrivate
       
   217 {
       
   218 public:
       
   219     QImageWriterPrivate(QImageWriter *qq);
       
   220 
       
   221     // device
       
   222     QByteArray format;
       
   223     QIODevice *device;
       
   224     bool deleteDevice;
       
   225     QImageIOHandler *handler;
       
   226 
       
   227     // image options
       
   228     int quality;
       
   229     int compression;
       
   230     float gamma;
       
   231     QString description;
       
   232     QString text;
       
   233 
       
   234     // error
       
   235     QImageWriter::ImageWriterError imageWriterError;
       
   236     QString errorString;
       
   237 
       
   238     QImageWriter *q;
       
   239 };
       
   240 
       
   241 /*!
       
   242     \internal
       
   243 */
       
   244 QImageWriterPrivate::QImageWriterPrivate(QImageWriter *qq)
       
   245 {
       
   246     device = 0;
       
   247     deleteDevice = false;
       
   248     handler = 0;
       
   249     quality = -1;
       
   250     compression = 0;
       
   251     gamma = 0.0;
       
   252     imageWriterError = QImageWriter::UnknownError;
       
   253     errorString = QT_TRANSLATE_NOOP(QImageWriter, QLatin1String("Unknown error"));
       
   254 
       
   255     q = qq;
       
   256 }
       
   257 
       
   258 /*!
       
   259     Constructs an empty QImageWriter object. Before writing, you must
       
   260     call setFormat() to set an image format, then setDevice() or
       
   261     setFileName().
       
   262 */
       
   263 QImageWriter::QImageWriter()
       
   264     : d(new QImageWriterPrivate(this))
       
   265 {
       
   266 }
       
   267 
       
   268 /*!
       
   269     Constructs a QImageWriter object using the device \a device and
       
   270     image format \a format.
       
   271 */
       
   272 QImageWriter::QImageWriter(QIODevice *device, const QByteArray &format)
       
   273     : d(new QImageWriterPrivate(this))
       
   274 {
       
   275     d->device = device;
       
   276     d->format = format;
       
   277 }
       
   278 
       
   279 /*!
       
   280     Constructs a QImageWriter objects that will write to a file with
       
   281     the name \a fileName, using the image format \a format. If \a
       
   282     format is not provided, QImageWriter will detect the image format
       
   283     by inspecting the extension of \a fileName.
       
   284 */
       
   285 QImageWriter::QImageWriter(const QString &fileName, const QByteArray &format)
       
   286     : d(new QImageWriterPrivate(this))
       
   287 {
       
   288     QFile *file = new QFile(fileName);
       
   289     d->device = file;
       
   290     d->deleteDevice = true;
       
   291     d->format = format;
       
   292 }
       
   293 
       
   294 /*!
       
   295     Destructs the QImageWriter object.
       
   296 */
       
   297 QImageWriter::~QImageWriter()
       
   298 {
       
   299     if (d->deleteDevice)
       
   300         delete d->device;
       
   301     delete d->handler;
       
   302     delete d;
       
   303 }
       
   304 
       
   305 /*!
       
   306     Sets the format QImageWriter will use when writing images, to \a
       
   307     format. \a format is a case insensitive text string. Example:
       
   308 
       
   309     \snippet doc/src/snippets/code/src_gui_image_qimagewriter.cpp 0
       
   310 
       
   311     You can call supportedImageFormats() for the full list of formats
       
   312     QImageWriter supports.
       
   313 
       
   314     \sa format()
       
   315 */
       
   316 void QImageWriter::setFormat(const QByteArray &format)
       
   317 {
       
   318     d->format = format;
       
   319 }
       
   320 
       
   321 /*!
       
   322     Returns the format QImageWriter uses for writing images.
       
   323 
       
   324     \sa setFormat()
       
   325 */
       
   326 QByteArray QImageWriter::format() const
       
   327 {
       
   328     return d->format;
       
   329 }
       
   330 
       
   331 /*!
       
   332     Sets QImageWriter's device to \a device. If a device has already
       
   333     been set, the old device is removed from QImageWriter and is
       
   334     otherwise left unchanged.
       
   335 
       
   336     If the device is not already open, QImageWriter will attempt to
       
   337     open the device in \l QIODevice::WriteOnly mode by calling
       
   338     open(). Note that this does not work for certain devices, such as
       
   339     QProcess, QTcpSocket and QUdpSocket, where more logic is required
       
   340     to open the device.
       
   341 
       
   342     \sa device(), setFileName()
       
   343 */
       
   344 void QImageWriter::setDevice(QIODevice *device)
       
   345 {
       
   346     if (d->device && d->deleteDevice)
       
   347         delete d->device;
       
   348 
       
   349     d->device = device;
       
   350     d->deleteDevice = false;
       
   351     delete d->handler;
       
   352     d->handler = 0;
       
   353 }
       
   354 
       
   355 /*!
       
   356     Returns the device currently assigned to QImageWriter, or 0 if no
       
   357     device has been assigned.
       
   358 */
       
   359 QIODevice *QImageWriter::device() const
       
   360 {
       
   361     return d->device;
       
   362 }
       
   363 
       
   364 /*!
       
   365     Sets the file name of QImageWriter to \a fileName. Internally,
       
   366     QImageWriter will create a QFile and open it in \l
       
   367     QIODevice::WriteOnly mode, and use this file when writing images.
       
   368 
       
   369     \sa fileName(), setDevice()
       
   370 */
       
   371 void QImageWriter::setFileName(const QString &fileName)
       
   372 {
       
   373     setDevice(new QFile(fileName));
       
   374     d->deleteDevice = true;
       
   375 }
       
   376 
       
   377 /*!
       
   378     If the currently assigned device is a QFile, or if setFileName()
       
   379     has been called, this function returns the name of the file
       
   380     QImageWriter writes to. Otherwise (i.e., if no device has been
       
   381     assigned or the device is not a QFile), an empty QString is
       
   382     returned.
       
   383 
       
   384     \sa setFileName(), setDevice()
       
   385 */
       
   386 QString QImageWriter::fileName() const
       
   387 {
       
   388     QFile *file = qobject_cast<QFile *>(d->device);
       
   389     return file ? file->fileName() : QString();
       
   390 }
       
   391 
       
   392 /*!
       
   393     This is an image format specific function that sets the quality
       
   394     level of the image to \a quality. For image formats that do not
       
   395     support setting the quality, this value is ignored.
       
   396 
       
   397     The value range of \a quality depends on the image format. For
       
   398     example, the "jpeg" format supports a quality range from 0 (low
       
   399     quality, high compression) to 100 (high quality, low compression).
       
   400 
       
   401     \sa quality()
       
   402 */
       
   403 void QImageWriter::setQuality(int quality)
       
   404 {
       
   405     d->quality = quality;
       
   406 }
       
   407 
       
   408 /*!
       
   409     Returns the quality level of the image.
       
   410 
       
   411     \sa setQuality()
       
   412 */
       
   413 int QImageWriter::quality() const
       
   414 {
       
   415     return d->quality;
       
   416 }
       
   417 
       
   418 /*!
       
   419     This is an image format specific function that set the compression
       
   420     of an image. For image formats that do not support setting the
       
   421     compression, this value is ignored.
       
   422 
       
   423     The value range of \a compression depends on the image format. For
       
   424     example, the "tiff" format supports two values, 0(no compression) and
       
   425     1(LZW-compression).
       
   426 
       
   427     \sa compression()
       
   428 */
       
   429 void QImageWriter::setCompression(int compression)
       
   430 {
       
   431     d->compression = compression;
       
   432 }
       
   433 
       
   434 /*!
       
   435     Returns the compression of the image.
       
   436 
       
   437     \sa setCompression()
       
   438 */
       
   439 int QImageWriter::compression() const
       
   440 {
       
   441     return d->compression;
       
   442 }
       
   443 
       
   444 /*!
       
   445     This is an image format specific function that sets the gamma
       
   446     level of the image to \a gamma. For image formats that do not
       
   447     support setting the gamma level, this value is ignored.
       
   448 
       
   449     The value range of \a gamma depends on the image format. For
       
   450     example, the "png" format supports a gamma range from 0.0 to 1.0.
       
   451 
       
   452     \sa quality()
       
   453 */
       
   454 void QImageWriter::setGamma(float gamma)
       
   455 {
       
   456     d->gamma = gamma;
       
   457 }
       
   458 
       
   459 /*!
       
   460     Returns the gamma level of the image.
       
   461 
       
   462     \sa setGamma()
       
   463 */
       
   464 float QImageWriter::gamma() const
       
   465 {
       
   466     return d->gamma;
       
   467 }
       
   468 
       
   469 /*!
       
   470     \obsolete
       
   471 
       
   472     Use setText() instead.
       
   473 
       
   474     This is an image format specific function that sets the
       
   475     description of the image to \a description. For image formats that
       
   476     do not support setting the description, this value is ignored.
       
   477 
       
   478     The contents of \a description depends on the image format.
       
   479 
       
   480     \sa description()
       
   481 */
       
   482 void QImageWriter::setDescription(const QString &description)
       
   483 {
       
   484     d->description = description;
       
   485 }
       
   486 
       
   487 /*!
       
   488     \obsolete
       
   489 
       
   490     Use QImageReader::text() instead.
       
   491 
       
   492     Returns the description of the image.
       
   493 
       
   494     \sa setDescription()
       
   495 */
       
   496 QString QImageWriter::description() const
       
   497 {
       
   498     return d->description;
       
   499 }
       
   500 
       
   501 /*!
       
   502     \since 4.1
       
   503 
       
   504     Sets the image text associated with the key \a key to
       
   505     \a text. This is useful for storing copyright information
       
   506     or other information about the image. Example:
       
   507 
       
   508     \snippet doc/src/snippets/code/src_gui_image_qimagewriter.cpp 1
       
   509 
       
   510     If you want to store a single block of data
       
   511     (e.g., a comment), you can pass an empty key, or use
       
   512     a generic key like "Description".
       
   513 
       
   514     The key and text will be embedded into the
       
   515     image data after calling write().
       
   516 
       
   517     Support for this option is implemented through
       
   518     QImageIOHandler::Description.
       
   519 
       
   520     \sa QImage::setText(), QImageReader::text()
       
   521 */
       
   522 void QImageWriter::setText(const QString &key, const QString &text)
       
   523 {
       
   524     if (!d->description.isEmpty())
       
   525         d->description += QLatin1String("\n\n");
       
   526     d->description += key.simplified() + QLatin1String(": ") + text.simplified();
       
   527 }
       
   528 
       
   529 /*!
       
   530     Returns true if QImageWriter can write the image; i.e., the image
       
   531     format is supported and the assigned device is open for reading.
       
   532 
       
   533     \sa write(), setDevice(), setFormat()
       
   534 */
       
   535 bool QImageWriter::canWrite() const
       
   536 {
       
   537     if (d->device && !d->handler && (d->handler = createWriteHandlerHelper(d->device, d->format)) == 0) {
       
   538         d->imageWriterError = QImageWriter::UnsupportedFormatError;
       
   539         d->errorString = QT_TRANSLATE_NOOP(QImageWriter,
       
   540                                            QLatin1String("Unsupported image format"));
       
   541         return false;
       
   542     }
       
   543     if (d->device && !d->device->isOpen())
       
   544         d->device->open(QIODevice::WriteOnly);
       
   545     if (!d->device || !d->device->isWritable()) {
       
   546         d->imageWriterError = QImageWriter::DeviceError;
       
   547         d->errorString = QT_TRANSLATE_NOOP(QImageWriter,
       
   548                                            QLatin1String("Device not writable"));
       
   549         return false;
       
   550     }
       
   551     return true;
       
   552 }
       
   553 
       
   554 /*!
       
   555     Writes the image \a image to the assigned device or file
       
   556     name. Returns true on success; otherwise returns false. If the
       
   557     operation fails, you can call error() to find the type of error
       
   558     that occurred, or errorString() to get a human readable
       
   559     description of the error.
       
   560 
       
   561     \sa canWrite(), error(), errorString()
       
   562 */
       
   563 bool QImageWriter::write(const QImage &image)
       
   564 {
       
   565     if (!canWrite())
       
   566         return false;
       
   567 
       
   568     if (d->handler->supportsOption(QImageIOHandler::Quality))
       
   569         d->handler->setOption(QImageIOHandler::Quality, d->quality);
       
   570     if (d->handler->supportsOption(QImageIOHandler::CompressionRatio))
       
   571         d->handler->setOption(QImageIOHandler::CompressionRatio, d->compression);
       
   572     if (d->handler->supportsOption(QImageIOHandler::Gamma))
       
   573         d->handler->setOption(QImageIOHandler::Gamma, d->gamma);
       
   574     if (!d->description.isEmpty() && d->handler->supportsOption(QImageIOHandler::Description))
       
   575         d->handler->setOption(QImageIOHandler::Description, d->description);
       
   576 
       
   577     if (!d->handler->write(image))
       
   578         return false;
       
   579     if (QFile *file = qobject_cast<QFile *>(d->device))
       
   580         file->flush();
       
   581     return true;
       
   582 }
       
   583 
       
   584 /*!
       
   585     Returns the type of error that last occurred.
       
   586 
       
   587     \sa ImageWriterError, errorString()
       
   588 */
       
   589 QImageWriter::ImageWriterError QImageWriter::error() const
       
   590 {
       
   591     return d->imageWriterError;
       
   592 }
       
   593 
       
   594 /*!
       
   595     Returns a human readable description of the last error that occurred.
       
   596 
       
   597     \sa error()
       
   598 */
       
   599 QString QImageWriter::errorString() const
       
   600 {
       
   601     return d->errorString;
       
   602 }
       
   603 
       
   604 /*!
       
   605     \since 4.2
       
   606 
       
   607     Returns true if the writer supports \a option; otherwise returns
       
   608     false.
       
   609 
       
   610     Different image formats support different options. Call this function to
       
   611     determine whether a certain option is supported by the current format. For
       
   612     example, the PNG format allows you to embed text into the image's metadata
       
   613     (see text()).
       
   614 
       
   615     \snippet doc/src/snippets/code/src_gui_image_qimagewriter.cpp 2
       
   616 
       
   617     Options can be tested after the writer has been associated with a format.
       
   618 
       
   619     \sa QImageReader::supportsOption(), setFormat()
       
   620 */
       
   621 bool QImageWriter::supportsOption(QImageIOHandler::ImageOption option) const
       
   622 {
       
   623     if (!d->handler && (d->handler = createWriteHandlerHelper(d->device, d->format)) == 0) {
       
   624         d->imageWriterError = QImageWriter::UnsupportedFormatError;
       
   625         d->errorString = QT_TRANSLATE_NOOP(QImageWriter,
       
   626                                            QLatin1String("Unsupported image format"));
       
   627         return false;
       
   628     }
       
   629 
       
   630     return d->handler->supportsOption(option);
       
   631 }
       
   632 
       
   633 /*!
       
   634     Returns the list of image formats supported by QImageWriter.
       
   635 
       
   636     By default, Qt can write the following formats:
       
   637 
       
   638     \table
       
   639     \header \o Format \o Description
       
   640     \row    \o BMP    \o Windows Bitmap
       
   641     \row    \o JPG    \o Joint Photographic Experts Group
       
   642     \row    \o JPEG   \o Joint Photographic Experts Group
       
   643     \row    \o PNG    \o Portable Network Graphics
       
   644     \row    \o PPM    \o Portable Pixmap
       
   645     \row    \o TIFF   \o Tagged Image File Format
       
   646     \row    \o XBM    \o X11 Bitmap
       
   647     \row    \o XPM    \o X11 Pixmap
       
   648     \endtable
       
   649 
       
   650     Reading and writing SVG files is supported through Qt's
       
   651     \l{QtSvg Module}{SVG Module}.
       
   652 
       
   653     \sa setFormat(), QImageReader::supportedImageFormats(), QImageIOPlugin
       
   654 */
       
   655 QList<QByteArray> QImageWriter::supportedImageFormats()
       
   656 {
       
   657     QSet<QByteArray> formats;
       
   658     formats << "bmp";
       
   659 #ifndef QT_NO_IMAGEFORMAT_PPM
       
   660     formats << "ppm";
       
   661 #endif
       
   662 #ifndef QT_NO_IMAGEFORMAT_XBM
       
   663     formats << "xbm";
       
   664 #endif
       
   665 #ifndef QT_NO_IMAGEFORMAT_XPM
       
   666     formats << "xpm";
       
   667 #endif
       
   668 #ifndef QT_NO_IMAGEFORMAT_PNG
       
   669     formats << "png";
       
   670 #endif
       
   671 
       
   672 #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS)
       
   673     QFactoryLoader *l = loader();
       
   674     QStringList keys = l->keys();
       
   675     for (int i = 0; i < keys.count(); ++i) {
       
   676         QImageIOPlugin *plugin = qobject_cast<QImageIOPlugin *>(l->instance(keys.at(i)));
       
   677         if (plugin && (plugin->capabilities(0, keys.at(i).toLatin1()) & QImageIOPlugin::CanWrite) != 0)
       
   678             formats << keys.at(i).toLatin1();
       
   679     }
       
   680 #endif // QT_NO_LIBRARY
       
   681 
       
   682     QList<QByteArray> sortedFormats;
       
   683     for (QSet<QByteArray>::ConstIterator it = formats.constBegin(); it != formats.constEnd(); ++it)
       
   684         sortedFormats << *it;
       
   685 
       
   686     qSort(sortedFormats);
       
   687     return sortedFormats;
       
   688 }
       
   689 
       
   690 QT_END_NAMESPACE