QT格式转换合集

本文主要介绍了qt与c++、halcon中一些基础格式格式的转换,后续会继续进行扩展更新。

QT格式转换合集

    • 一、图像篇
      • 1、QImage与Mat互相转换
      • 2、QImage与QPixmap互相转换
      • 3、QImage与HImage互相转换
      • 4、unsigned char* (uchar*) 转QImage
      • 5、unsigned char* (uchar*) 转Mat
    • 二、字符篇
      • 1、QString与String互相转换
      • 2、QString与Char*互相转换
      • 3、int与QString相互转换
      • 4、QString与HTuple相互转换
    • 参考内容

一、图像篇

1、QImage与Mat互相转换

Qimage转Mat

//Qt读入彩色图后一般为Format_RGB32格式(4通道),而OpenCV一般用3通道的,因此进行了转换。
cv::Mat QImage2Mat(QImage image)
{
    cv::Mat mat;
    switch (image.format())
    {
    case QImage::Format_RGB32:  //一般Qt读入彩色图后为此格式
        mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat,mat,cv::COLOR_BGRA2BGR);   //转3通道
        break;
    case QImage::Format_RGB888:
        mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
        cv::cvtColor(mat,mat,cv::COLOR_RGB2BGR);
        break;
    case QImage::Format_Indexed8:
        mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
        break;
    }
    return mat;
}

Mat转QImage

QImage Mat2QImage(const cv::Mat &mat)
{
    if(mat.type()==CV_8UC1 || mat.type()==CV_8U)
    {
        QImage image((const uchar *)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8);
        return image;
    }
    else if(mat.type()==CV_8UC3)
    {
        QImage image((const uchar *)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        return image.rgbSwapped();  //r与b调换
    }
}

2、QImage与QPixmap互相转换

    QPainter p(this);
    QPixmap pixmap;
    pixmap.load("../image/test.jpg");
 
    //QPixmap->QImage
    QImage tempImage = pixmap.toImage();
    p.drawImage(0,0,tempImage);
 
    QImage image;
    image.load("../image/test.jpg");
 
    //QImage->QPixmap
    QPixmap tempPixmap = QPixmap::fromImage(image);
    p.drawPixmap(450,0,tempPixmap);

思考:QPixmap、QImage、QPicture的关系

3、QImage与HImage互相转换

QImage转HImage

    /**
     * @brief QImage2HImage 将 Qt QImage 转换为 Halcon 的 HImage
     * @param from 输入的 QImage
     * @param to 输出的 HImage ,from 和 to 不共享内存数据。 每次都会为 to 重新分配内存。
     * @return true 表示转换成功,false 表示转换失败。
     */
    bool QImage2HImage(QImage &from, HalconCpp::HImage &to)
    {
        if(from.isNull()) return false;
    
        int width = from.width(), height = from.height();
        QImage::Format format = from.format();
    
        if(format == QImage::Format_RGB32 ||
                format == QImage::Format_ARGB32 ||
                format == QImage::Format_ARGB32_Premultiplied)
        {
            to.GenImageInterleaved(from.bits(), "rgbx", width, height, 0,  "byte", width, height, 0, 0, 8, 0);
            return true;
        }
        else if(format == QImage::Format_RGB888)
        {
            to.GenImageInterleaved(from.bits(), "rgb", width, height, 0,  "byte", width, height, 0, 0, 8, 0);
            return true;
        }
        else if(format == QImage::Format_Grayscale8 || format == QImage::Format_Indexed8)
        {
            to.GenImage1("byte", width, height, from.bits());
            return true;
        }
        return false;
    }

HImage转QImage

    /**
     * @brief HImage2QImage 将 Halcon 的 HImage 转换为 Qt 的 QImage
     * @param from HImage ,暂时只支持 8bits 灰度图像和 8bits 的 3 通道彩色图像
     * @param to QImage ,这里 from 和 to 不共享内存。如果 to 的内存大小合适,那么就不用重新分配内存。所以可以加快速度。
     * @return  true 表示转换成功,false 表示转换失败
     */
    bool HImage2QImage(HalconCpp::HImage &from, QImage &to)
    {
        Hlong width;
        Hlong height;
        from.GetImageSize(&width, &height);
    
        HTuple channels = from.CountChannels();
        HTuple type = from.GetImageType();
    
        if( strcmp(type[0].S(), "byte" )) // 如果不是 byte 类型,则失败
        {
            return false;
        }
    
        QImage::Format format;
        switch(channels[0].I())
        {
        case 1:
            format = QImage::Format_Grayscale8;
            break;
        case 3:
            format = QImage::Format_RGB32;
            break;
        default:
            return false;
        }
    
        if(to.width() != width || to.height() != height || to.format() != format)
        {
            to = QImage(static_cast<int>(width),
                        static_cast<int>(height),
                        format);
        }
        HString Type;
        if(channels[0].I() == 1)
        {
            unsigned char * pSrc = reinterpret_cast<unsigned char *>( from.GetImagePointer1(&Type, &width, &height) );
            memcpy( to.bits(), pSrc, static_cast<size_t>(width) * static_cast<size_t>(height) );
            return true;
        }
        else if(channels[0].I() == 3)
        {
            uchar *R, *G, *B;
            from.GetImagePointer3(reinterpret_cast<void **>(&R),
                                  reinterpret_cast<void **>(&G),
                                  reinterpret_cast<void **>(&B), &Type, &width, &height);
    
            for(int row = 0; row < height; row ++)
            {
                QRgb* line = reinterpret_cast<QRgb*>(to.scanLine(row));
                for(int col = 0; col < width; col ++)
                {
                    line[col] = qRgb(*R++, *G++, *B++);
                }
            }
            return true;
        }
    
        return false;
    }

4、unsigned char* (uchar*) 转QImage

方法1 QImage

QImage image((unsigned char*)imgData,imgHigh,imgWidth,QImage::Format_RGB32);

方法2 QByteArray

image.loadFromData((unsigned char*)imgData,readLen,"JPG");

方法3 QByteArray

image = image.fromData((unsigned char*)imgData,readLen,"JPG");

5、unsigned char* (uchar*) 转Mat

cv::Mat mat = cv::Mat(stFrameInfo.nHeight, stFrameInfo.nWidth, CV_8UC1, stImageInfo.pBufAddr, 0);

二、字符篇

1、QString与String互相转换

//QString转String
QString qStr = "hello world!";
String str = qStr.toStdString();
//String 转QString
string  str = "hello world!";
QString qStr= QString::fromStdString(str);

2、QString与Char*互相转换

//QString转为char*
QString  str;
char*  ch = str.toLatin1(); // must

//char*转qstring
char*  ch = "hello world!";
QString str = QString::fromUtf8(ch);

3、int与QString相互转换

//int转QString
int number = 10086;
QString str = QString::number(number);

//QString转int
QString str = "10086";
int number = str.toInt();
在这里插入代码片

4、QString与HTuple相互转换

在这里插入代码片

参考内容

QString与char *转换
----------------------------------分割线----------------------------------
  本人承诺以上文章为本人整理编写。写在这里一是为了防止以后自己将知识点遗忘,二是为了和大家分享我自己对这个知识点的理解和认识。如果我的文章中有错误希望看到后可以指正,感激不尽!另:未经允许不得擅自转载。

你可能感兴趣的:(C/C++,qt,halcon,c++,格式转换,QImage)