diff --git a/src/plugins/imageformats/dds/qddshandler.cpp b/src/plugins/imageformats/dds/qddshandler.cpp
index 8dd5ed35ac1ae3776b18a8533ad2032839ce29a0..01a878280332c0cdfb123d86dff4ccd213b96483 100644
--- a/src/plugins/imageformats/dds/qddshandler.cpp
+++ b/src/plugins/imageformats/dds/qddshandler.cpp
@@ -1266,18 +1266,19 @@ bool QDDSHandler::read(QImage *outImage)
 
 bool QDDSHandler::write(const QImage &outImage)
 {
-    QDataStream s( device() );
+    const QImage image = outImage.convertToFormat(QImage::Format_ARGB32);
+
+    QDataStream s(device());
     s.setByteOrder(QDataStream::LittleEndian);
 
-    // Filling header
     DDSHeader dds;
     // Filling header
     dds.magic = ddsMagic;
     dds.size = 124;
     dds.flags = DDSHeader::FlagCaps | DDSHeader::FlagHeight |
                 DDSHeader::FlagWidth | DDSHeader::FlagPixelFormat;
-    dds.height = outImage.height();
-    dds.width = outImage.width();
+    dds.height = image.height();
+    dds.width = image.width();
     dds.pitchOrLinearSize = 128;
     dds.depth = 0;
     dds.mipMapCount = 0;
@@ -1300,9 +1301,9 @@ bool QDDSHandler::write(const QImage &outImage)
     dds.pixelFormat.bBitMask = 0x000000ff;
 
     s << dds;
-    for (int width = 0; width < outImage.width(); width++) {
-        for (int height = 0; height < outImage.height(); height++) {
-            QRgb pixel = outImage.pixel(height, width);;
+    for (int width = 0; width < image.width(); width++) {
+        for (int height = 0; height < image.height(); height++) {
+            QRgb pixel = image.pixel(height, width);;
             quint32 color;
             quint8 alpha = qAlpha(pixel);
             quint8 red = qRed(pixel);
diff --git a/tests/auto/dds/tst_qdds.cpp b/tests/auto/dds/tst_qdds.cpp
index de05ec4f56725b1e445157835b1015522c11ebca..4464b991d2c65985c084ef1b05bfca51632de78d 100644
--- a/tests/auto/dds/tst_qdds.cpp
+++ b/tests/auto/dds/tst_qdds.cpp
@@ -52,6 +52,8 @@ private slots:
     void readImage();
     void testMipmaps_data();
     void testMipmaps();
+    void testWriteImage_data();
+    void testWriteImage();
 };
 
 void tst_qdds::readImage_data()
@@ -149,5 +151,32 @@ void tst_qdds::testMipmaps()
     }
 }
 
+void tst_qdds::testWriteImage_data()
+{
+    QTest::addColumn<QString>("fileName");
+    QTest::addColumn<QSize>("size");
+
+    QTest::newRow("1") << QString("A8R8G8B8") << QSize(64, 64);
+}
+
+void tst_qdds::testWriteImage()
+{
+    QFETCH(QString, fileName);
+    QFETCH(QSize, size);
+
+    const QString path = fileName + QStringLiteral(".dds");
+    const QString sourcePath = QStringLiteral(":/dds/") + fileName + QStringLiteral(".dds");
+
+    QImage image(sourcePath);
+    QVERIFY(!image.isNull());
+    QVERIFY(image.size() == size);
+
+    QImageWriter writer(path, QByteArrayLiteral("dds"));
+    QVERIFY2(writer.canWrite(), qPrintable(writer.errorString()));
+    QVERIFY2(writer.write(image), qPrintable(writer.errorString()));
+
+    QVERIFY(image == QImage(path));
+}
+
 QTEST_MAIN(tst_qdds)
 #include "tst_qdds.moc"