Kaynağa Gözat

Add ctk::kwIconToQImage to easily convert base64/zlib encode images

Julien Finet 14 yıl önce
ebeveyn
işleme
209353d5e1

+ 2 - 0
Libs/Widgets/Testing/Cpp/CMakeLists.txt

@@ -66,6 +66,7 @@ SET(TEST_SOURCES
   ctkThumbnailWidgetTest1.cpp
   ctkToolTipTrapperTest1.cpp
   ctkTreeComboBoxTest1.cpp
+  ctkWidgetsUtilsTest1.cpp
   ctkWorkflowWidgetTest1.cpp
   ctkWorkflowWidgetTest2.cpp
   ctkExampleUseOfWorkflowWidgetUsingDerivedSteps.cpp
@@ -192,6 +193,7 @@ SIMPLE_TEST( ctkThumbnailListWidgetTest1 )
 SIMPLE_TEST( ctkThumbnailWidgetTest1 )
 SIMPLE_TEST( ctkToolTipTrapperTest1 )
 SIMPLE_TEST( ctkTreeComboBoxTest1 )
+SIMPLE_TEST( ctkWidgetsUtilsTest1 )
 SIMPLE_TEST( ctkWorkflowWidgetTest1 )
 SIMPLE_TEST( ctkWorkflowWidgetTest2 )
 

+ 99 - 0
Libs/Widgets/Testing/Cpp/ctkWidgetsUtilsTest1.cpp

@@ -0,0 +1,99 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+  =========================================================================*/
+
+// QT includes
+#include <QApplication>
+#include <QLabel>
+#include <QTimer>
+
+// CTK includes
+#include "ctkWidgetsUtils.h"
+
+// STD includes
+#include <cstdlib>
+#include <iostream>
+
+/* 
+ * Resource generated for file:
+ *    NAMICLogo.png (zlib, base64) (image file)
+ */
+static const unsigned int  image_NAMICLogo_width          = 33;
+static const unsigned int  image_NAMICLogo_height         = 40;
+static const unsigned int  image_NAMICLogo_pixel_size     = 3;
+static const unsigned long image_NAMICLogo_length         = 2196;
+static const unsigned long image_NAMICLogo_decoded_length = 3960;
+
+static const unsigned char image_NAMICLogo[] = 
+  "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"
+  "asevkBFcYnYmX6577yP5n9Qys=";
+
+//-----------------------------------------------------------------------------
+int ctkWidgetsUtilsTest1(int argc, char * argv [] )
+{
+  QApplication app(argc, argv);
+
+  QImage image = ctk::kwIconToQImage(image_NAMICLogo,
+    image_NAMICLogo_width, image_NAMICLogo_height,
+    image_NAMICLogo_pixel_size, image_NAMICLogo_length);
+
+  QLabel label;
+  label.setPixmap(QPixmap::fromImage(image));
+  label.show();
+
+  if (argc < 2 && QString(argv[1]) != "-I")
+    {
+    QTimer::singleShot(100, &app, SLOT(quit()));
+    }
+  return app.exec();
+}
+
+
+
+

+ 37 - 0
Libs/Widgets/ctkWidgetsUtils.cpp

@@ -35,3 +35,40 @@ QString ctk::base64HTMLImageTagSrc(const QImage& image)
   return QString("data:image/png;base64,%1")
     .arg(QString(buffer.data().toBase64()));
 }
+
+//----------------------------------------------------------------------------
+QImage ctk::kwIconToQImage(const unsigned char *data, int width, int height, int pixelSize, unsigned int bufferLength, int options)
+{
+  Q_UNUSED(options); // not yet supported
+
+  QByteArray imageData = QByteArray::fromRawData(
+    reinterpret_cast<const char *>(data), bufferLength);
+  unsigned int expectedLength = width * height * pixelSize;
+  // Start with a zlib header ? If not, then it must be base64 encoded
+  if (bufferLength != expectedLength &&
+      static_cast<unsigned char>(imageData[0]) != 0x78 &&
+      static_cast<unsigned char>(imageData[1]) != 0xDA)
+    {
+    imageData = QByteArray::fromBase64(imageData);
+    bufferLength = imageData.size();
+    }
+
+  if (bufferLength != expectedLength &&
+      static_cast<unsigned char>(imageData[0]) == 0x78 &&
+      static_cast<unsigned char>(imageData[1]) == 0xDA)
+    {
+    imageData.prepend((char)((expectedLength >> 0) & 0xFF));
+    imageData.prepend((char)((expectedLength >> 8) & 0xFF));
+    imageData.prepend((char)((expectedLength >> 16) & 0xFF));
+    imageData.prepend((char)((expectedLength >> 24) & 0xFF));
+    imageData = qUncompress(imageData);
+    }
+  QImage image(reinterpret_cast<unsigned char*>(imageData.data()),
+               width, height, width * pixelSize,
+               pixelSize == 4 ? QImage::Format_ARGB32 : QImage::Format_RGB888);
+  if (pixelSize == 4)
+    {
+    return image.rgbSwapped();
+    }
+  return image.copy();
+}

+ 6 - 0
Libs/Widgets/ctkWidgetsUtils.h

@@ -34,6 +34,12 @@ namespace ctk {
 /// QString("<img src=\"%1\">").arg(base64HTMLImageTagSrc(myImage);
 QString CTK_WIDGETS_EXPORT base64HTMLImageTagSrc(const QImage& image);
 
+///
+/// \ingroup Widgets
+/// Convert an KWidget encoded image into a QImage
+/// The data can be base64 encoded and/or zlib compressed.
+QImage CTK_WIDGETS_EXPORT kwIconToQImage(const unsigned char *data, int width, int height, int pixelSize, unsigned int bufferLength, int options = 0);
+
 }
 
 #endif