将HObject类型转为Qimage类型

工业相机采图方式、图像格式(BYTE、HObject和Mat)转换 使用Halcon采图助手进行采图比较适合新手,没有太大的编程量,也可以用于项目前期的方案制定,图像处理评估等;第一种采图方法的适用性更广,可以满足不同项目的开发需求。 阅读详情

差不多一个月前,在尝试解决将halcon的图像显示在Qt的窗口界面时,考虑过将halcon的HObject类型转换成qt的QImage类型,结果因为太菜了(网上也找不到类似的例子)而没能成功,具体见原来的文章qt窗口中显示halcon的图像

这两天花了点时间,理清思路,参考网上资料加上自己摸索出来方法然后实践了一下,能实现两种格式的转换(halcon to Qt)并能显示出来,就是转化耗时有点不尽人意。

先说说思路历程:

虽然网上没有找到Hobject和Qimage间转化的例子,但是有很多HObject转Vc或者转opencv类型的例子,

如:

VC中bmp图片和Halcon中图片类型相互转换

Halcon图像与Opencv图像相互转换(C++代码)

从这些例子中可以学到一些图像转换的思路:

先获取Hobject类型图像的图像数据指针及尺寸大小,再根据目标图像类型格式初始化一个相应大小的数据空间,然后按照一定的格式将HObject图像数据copy到目标图像数据空间,最后使用生成目标图像的函数。(这里大致说下思路,细节在后面写)

从halcon的Hobject图像类型中获取图像数据指针比较简单,问题是如何图像数据里面的值给复制到目标图像数据空间的对应位置,这就得弄清Hobject图像数据的存储格式和数据类型,以及QImage图像数据的存储格式和数据类型。

首先了解下HObject图像(像素?)的数据类型:

有byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field这些,但一般都是byte类型,这里做图像转换也是用的byte这种类型。

HObject图像的byte类型的特点:(这里都是按自己理解编的)每个像素的一个通道的灰度值用byte类型来存储(byte类型,即一个字节,为8bit,也就是说图像的位深为8位,可以表示范围0到255的值,所以bmp图像灰度值的范围也是0~255),比如三通道图就是每个像素点都有rgb三个通道的灰度值,每个通道用一个byte来存值,单通道图的话每个像素就一个byte来存值。

然后了解下生成QImage图像需要的数据格式:

QImage 图像格式小结 这篇文章对我的帮助很大,整篇文章内容都有用 ,看完对我启发很大。

    比如要用到的根据公式: W = ( w * bitcount + 31 )/32 * 4 计算得到的W是QImage图像每行的字节数。

    比如三通道和单通道需要不同的图像格式:

        QImage::Format_RGB888,存入格式为R, G, B 对应 0,1,2

        QImage::Format_Indexed8,需要设定颜色表,QVector<QRgb>

    以及,采用指针取值,行扫的方式对每个像素处理,还解决了数据补齐的问题。

然后是如何从图像数据生成QImage:

参考了这篇文章【QT】处理图像数据 中:

通过数据流读取:

QImage::QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) //连续内存的读写版本

QImage::QImage(const uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) //连续内存的只读版本

QImage::QImage(uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) //非连续内存的读写版本

QImage::QImage(const uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR) //非连续内存的只读版本

这里的数据流指的是图像数据以二进制流的形式存放在内存中。
注意,QImage只支持8位深的单通道灰度图像,此时需要设置colortabel或者将单通道转3通到,对于彩色图像则可以直接创建。
QImage内部数据按照行4字节对齐,即图像一行的字节数必须整除4,如果图像实际宽度w能整除4,则可以采用连续内存的构造函数创建QImage,如果图像实际宽度不能整除4,则必须采用非连续内存的构造函数创建QImage,此时需要指定每行的实际字节数

示例:对于w* h=1000 * 1000的图像,由于1000/4=250,可以采用连续内存的构造函数

//imgData的格式是RGB888
QImage qimage(imgData,1000,1000,QImage::Format_RGB888);

对于w* h=1050 * 1000的图像,由于1050/4=262.5,必须采用非连续内存的构造函数

//imgData的格式是RGB888
QImage qimage(imgData,1050,1000,1050*3,QImage::Format_RGB888);

在创建QImage时,构造函数自动在每一行后面补零,由于w=1050,每行字节数=3150,需要补2个字节,即3152,实际qimage占用内存为3152*1000,比原来多了2000个字节。


下面是完成的代码

void HObjectToQImage(HObject himage,QImage **qimage)
{
    HTuple hChannels;
    HTuple   width,height;
    width=height=0;
    HTuple htype;
    ConvertImageType(himage,&himage,"byte");//将图片转化成byte类型
    CountChannels(himage,&hChannels);       //判断图像通道数

    if(hChannels[0].I()==1)//单通道图
    {
        HTuple hv_pointer;
        unsigned char *ptr;
        GetImagePointer1(himage,&hv_pointer,&htype,&width,&height);

        ptr=(unsigned char *)hv_pointer[0].L();

         *(*qimage)=QImage(ptr,width,height,width,QImage::Format_Indexed8);//不知道是否已自动4字节对齐
    }
    else if(hChannels[0].I()==3)//三通道图
    {
        HTuple hv_ptrRed,hv_ptrGreen,hv_ptrBlue;
        GetImagePointer3(himage,&hv_ptrRed,&hv_ptrGreen,&hv_ptrBlue,&htype,&width,&height);

        uchar *ptrRed=(uchar*)hv_ptrRed[0].L();
        uchar *ptrGreen=(uchar*)hv_ptrGreen[0].L();
        uchar *ptrBlue=(uchar*)hv_ptrBlue[0].L();
        int bytesperline=(width*8*3+31)/32*4;//针对位深为8的三通道图进行每行4字节对齐补齐
        int bytecount=bytesperline*height;//整个图像数据需要的字节数
        uchar* data8=new uchar[bytecount];
        int lineheadid,pixid;
        for(int i=0;i<height;i++)
        {
            lineheadid=bytesperline*i;//计算出图像第i行的行首在图像数据中的地址
            for(int j=0;j<width;j++)
            {
                pixid=lineheadid+j*3;//计算坐标为(i,j)的像素id
                data8[pixid]=ptrRed[width*i+j];
                data8[pixid+1]=ptrGreen[width*i+j];
                data8[pixid+2]=ptrBlue[width*i+j];
            }
        }

        *(*qimage)=QImage(data8,width,height,QImage::Format_RGB888);
    }
}

单通道和三通道的数据传输部分有些不一样,单通道直接获取的一个数据指针,可以用指针赋值直接通过图像数据生成QImage;三通道则是生成了三个通道的指针,所以需要通过遍历每个像素数据,将三个通道的数据整合成符合Format_RGB888的图像数据,再将数据生成QImage。


总结:因为三通道图转换过程中有遍历图像像素的过程,耗时明显感觉较长,不知从何处改进。


在网上找到一个例子,有些地方实现方法不一样,可以借鉴下

阅读:708回复:0 Hobject 转 QImage

————————————————————————————————————————————————————

上面那个三通道图像转换的速度实在是太慢了,想寻找优化的方法。发现时间都耗在循环中的数组赋值,开始想的是字符数组的赋值效率问题,改进了下赋值方式

                *(data8+pixid)=*(ptrRed+width*i+j);
                *(data8+pixid+1)=*(ptrGreen+width*i+j);
                *(data8+pixid+2)=*(ptrBlue+width*i+j);

将时间从两秒多降到了一秒多,但是效率还是远远不够。

想着如果halcon中三通道图也能像单通道图那样获取一个图像数据指针就好了,后来还真找到了这个方法。

想起了以前看到过的一个halcon例程:gen_image_interleaved,内容大概是这样

* This example program shows how to use gen_image_interleaved. It performs
* various transformations of an image matrix with interleaved pixels into
* a three-channel HALCON image.
* 
* First of all an image matrix with interleaved pixels is calculated.
read_image (Image, 'claudia')
rgb3_to_interleaved (Image, ImageInterleaved)
* 
get_image_pointer1 (ImageInterleaved, Pointer, TypeRGB, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 3, Height, 'black', WindowHandle)
dev_set_part (0, 0, Height, Width / 3)
* 
* A simple conversion.
gen_image_interleaved (BImageRGB1, Pointer, 'rgb', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0)
展示了如何用这个算子将一个像素交织着的图像(直接照字面意思翻译过来的)矩阵转换成一个三通道的halcon图像,为了展示,首先就通过
rgb3_to_interleaved

转换出一个交织的像素(以前看到时候不懂什么是interleaved pixels,现在才知道就是我想要的rgb图像格式)的图像。

再通过获取单通道图像数据指针的方式获取这个交织像素图像数据的指针(这就是我们想要的),后面就是转化成halcon图像了。

然后就是实现:

将halcon代码导出为c++文件,打开提取需要的部分,发现短短一行

rgb3_to_interleaved (Image, ImageInterleaved)

在c++文件里面是一大段函数实现的:

void rgb3_to_interleaved (HObject ho_ImageRGB, HObject *ho_ImageInterleaved);
void rgb3_to_interleaved (HObject ho_ImageRGB, HObject *ho_ImageInterleaved)
{
  // Local iconic variables
  HObject  ho_ImageAffineTrans, ho_ImageRed, ho_ImageGreen;
  HObject  ho_ImageBlue, ho_RegionGrid, ho_RegionMoved, ho_RegionClipped;

  // Local control variables
  HTuple  hv_PointerRed, hv_PointerGreen, hv_PointerBlue;
  HTuple  hv_Type, hv_Width, hv_Height, hv_HomMat2DIdentity;
  HTuple  hv_HomMat2DScale;

  GetImagePointer3(ho_ImageRGB, &hv_PointerRed, &hv_PointerGreen, &hv_PointerBlue,
      &hv_Type, &hv_Width, &hv_Height);
  GenImageConst(&(*ho_ImageInterleaved), "byte", hv_Width*3, hv_Height);
  //
  HomMat2dIdentity(&hv_HomMat2DIdentity);
  HomMat2dScale(hv_HomMat2DIdentity, 1, 3, 0, 0, &hv_HomMat2DScale);
  AffineTransImageSize(ho_ImageRGB, &ho_ImageAffineTrans, hv_HomMat2DScale, "constant",
      hv_Width*3, hv_Height);
  //
  Decompose3(ho_ImageAffineTrans, &ho_ImageRed, &ho_ImageGreen, &ho_ImageBlue);
  GenGridRegion(&ho_RegionGrid, 2*hv_Height, 3, "lines", hv_Width*3, hv_Height+1);
  MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 0);
  ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);
  //NOTE: Due to internal limitations, the images ImageRed, ImageGreen, and ImageBlue
  //cannot be displayed by HDevelop.Trying to display one of these images results in the
  //error message 'Internal error: number of chords too big for num_max'. However, this
  //affects by no means the continuation or the results of this example program, and
  //therefore, is no reason to be alarmed !
  ReduceDomain(ho_ImageRed, ho_RegionClipped, &ho_ImageRed);
  MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 1);
  ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);
  ReduceDomain(ho_ImageGreen, ho_RegionClipped, &ho_ImageGreen);
  MoveRegion(ho_RegionGrid, &ho_RegionMoved, -1, 2);
  ClipRegion(ho_RegionMoved, &ho_RegionClipped, 0, 0, hv_Height-1, (3*hv_Width)-1);
  ReduceDomain(ho_ImageBlue, ho_RegionClipped, &ho_ImageBlue);
  OverpaintGray((*ho_ImageInterleaved), ho_ImageRed);
  OverpaintGray((*ho_ImageInterleaved), ho_ImageGreen);
  OverpaintGray((*ho_ImageInterleaved), ho_ImageBlue);
  return;
}

暂时还没研究具体是什么原理,先用着。。。。

于是类型转化函数变成了这样:

void HObjectToQImage(HObject himage,QImage **qimage)
{
    HTuple hChannels;
    HTuple   width,height;
    width=height=0;
    HTuple htype;
    HTuple hpointer;

    ConvertImageType(himage,&himage,"byte");//将图片转化成byte类型
    CountChannels(himage,&hChannels);       //判断图像通道数

    if(hChannels[0].I()==1)//单通道图
    {
        unsigned char *ptr;

        GetImagePointer1(himage,&hpointer,&htype,&width,&height);

        ptr=(unsigned char *)hpointer[0].L();
        *(*qimage)=QImage(ptr,width,height,width,QImage::Format_Indexed8);//不知道是否已自动4字节对齐
    }
    else if(hChannels[0].I()==3)//三通道图
    {
        unsigned char *ptr3;
        HObject ho_ImageInterleaved;
        rgb3_to_interleaved(himage, &ho_ImageInterleaved);

        GetImagePointer1(ho_ImageInterleaved, &hpointer, &htype, &width, &height);

        ptr3=(unsigned char *)hpointer[0].L();
        *(*qimage)=QImage(ptr3,width/3,height,width,QImage::Format_RGB888);
    }
}
注意其中
        *(*qimage)=QImage(ptr3,width/3,height,width,QImage::Format_RGB888);

因为在rgb3_to_interleaved时,将图像宽度拉长为原来的三倍,所以在GetImagePointer1生成图像数据时获取的图像宽度是实际宽度的三倍,因此在给QImage传参数时需要将width/3,而第四个参数行数据宽度就刚好是width了。

 测了下转换时间,已经降到了原来的百分之一左右(原来要1s现在只要0.01s),虽然还是不算快,不过已经进步了很多。

还有个小问题是转换生成的图像的前几个像素有点问题,如这样:

放大看是这样,,(O_O)?

暂时不知道是怎么出现这种问题的,不过应该问题不大。


                                    







Qt中的QImage转Halcon中的HObject 彩色图像: //截取电脑屏幕图像 QPixmap pixMap = QPixmap::grabWindow(QApplication::desktop()->winId()); pixMap.save("D:/A.png", "png"); HalconCpp::HObject ho_ImageR, ho_ImageG, ho_ImageB; QImage qimg = pixMap.toImage(); int width = qimg.width(); int height = 阅读详情

相关推荐

别再为图像格式转换头疼了!一份代码搞定大恒相机数据到BMP、HObject、Mat、QImage的互转

本文为工业视觉开发者提供大恒相机图像数据格式转换的完整解决方案,涵盖从IImageData到BMP、HObject、Mat和QImage的互转方法。通过详细的C#和C++代码示例,帮助开发者高效处理图像格式转换问题,提升工业视觉项目开发效率。

weixin_30768881的博客 365

[视觉实战案例]Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法

Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法

fengyaowuhui的博客 7156

别再为海康相机数据转换头疼了!一份代码搞定QImage、Halcon HObject和OpenCV Mat

本文详细介绍了如何高效将海康相机采集的unsigned char*数据转换为Qt的QImage、Halcon的HObject和OpenCV的Mat三种主流格式,解决工业视觉开发中的图像格式转换难题。通过代码示例和最佳实践,帮助开发者优化性能并确保跨平台兼容性。

weixin_30300225的博客 433

HObject转换为QImage

在Qt中需要先将HObject转换为QImage,然后再使用。

qq_43287931的博客 835

QImage 与 HObject相互转换

主要支持两种格式相互转换,QImage 与 HObjec,在多通道下的转换,其中是一个头文件,可以直接导入引用函数。

Hobject2QImage.h

halcon的hobject转qt的qimage,和反过来转,有需要的请下载

QImage、cv::Mat 与 HalconCpp::HObject 之间的转换

在机器视觉应用中,不同的图像处理库和框架常使用不同的数据结构来表示图像。常用的库包括 Qt 的 QImage、OpenCV 的 cv::Mat 以及 Halcon 的 HObject。为了在这些库之间实现无缝的数据传递和处理,图像格式的转换成为必不可少的环节。本文将详细介绍如何在 QImage、cv::Mat 和 HalconCpp::HObject 之间进行相互转换,并提供相应的代码实现。

专注于 Qt/C++ 应用开发和机器视觉领域的开源项目分享。期待与您共同进步! 1352

QImage转Hobject.txt

QImage转(Halcon)HObject,主要改善了可能存在图片的四字节对齐问题

QImage与HObject相互转换工具:提升图像处理效率的利器

QImage与HObject相互转换工具:提升图像处理效率的利器 去发现同类优质开源项目:https://gitcode.com/ 在图像处理领域,不同图像格式之间的转换是常见需求,而QImage与HObject作为两种常见的图像格式,其转换工具的重要性不言而喻。本文将为您详细介绍一款名为“QImage与HObject相互转换工具”的开源项目,带您探索其核心功能、技术分析、应用场景以及项目特点。 ...

gitblog_06736的博客 430

halcon图片Qt图片互转

halcon彩色图片转化成Qt彩色图片,或者Qt彩色图片转化为halcon彩色图片,也就是HObject QImage的互转,希望有帮助

Excel也能玩转K-means聚类?手把手教你用表格搞定用户分群(附完整公式)

本文详细介绍了如何在Excel中实现K-means聚类算法,无需编程即可完成用户分群。通过SUMIF、SQRT等基础函数,从数据预处理到最终分群全流程手把手教学,特别强调数据标准化和迭代优化的关键步骤,帮助运营团队低成本高效分析用户行为数据。

weixin_30555125的博客 181

QImage/cv::Mat/HObject的图像格式互相转换,4字节对齐

即int step = int((width + 3) / 4) * 4;技术篇——分享相机buffer、HObject、QImage的转换问题。技术篇——分享相机buffer、HObject、QImage的转换问题。用户手动生成一幅4字节倍数宽度的空白图片,再把原图拷贝过来即可解决。8位图,宽度换算成4字节的整数倍,使用公式1。,否则会有宽度4字节对齐的问题。公式1:位宽大于等于8的位图。公式2:位宽小于8的位图。

$firecat利白的代码足迹$ 4226

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 340

QImage 与 HObject相互转换工具

QImage 与 HObject相互转换工具 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了一种便捷的方法,用于实现QImage与HObject两种图像格式之间的相互转换。本资源主要包括一个头文件,其中包含了可以直接导入和引用的转换函数。 功能特性 支持QImage与HObject两种图像格式的相互转换。 适用于多通道图像的转换。 使用说明 下载并引入包含转换...

gitblog_06794的博客 422

kaggle竞赛平台上数据集下载详解

从kaggle 网站上下载数据集既保证了速度又避免了网络的不稳定造成下载失败问题。该平台也可以上传代码作为自己的代码库,不过本人更习惯将代码上传到github上。希望本人整理的kaggle库使用技巧能够帮助到正在阅读本博客的你。此外还有一篇博客针对kaggle数据集下载问题的几个问题的相关文章进行了整理【博客链接】。

li1784506的博客 2万+

嵌入式Linux网络调试:YT8531/YT8521 PHY驱动移植与设备树配置避坑指南

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的关键技术,涵盖内核驱动适配、RGMII接口时序调整及常见问题排查。针对Motorcomm千兆以太网PHY芯片,提供详细的设备树配置示例和调试技巧,帮助开发者规避典型设计陷阱,确保网络功能稳定运行。

weixin_42525632的博客 673

cv::Mat HObject QImage图像的区别

mat hobject qimage三者的区别

weixin_43575474的博客 872

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1574

海康相机采集图像 data (unsigned char*) 转QImage、Hobject、Mat

qt、c++工业相机数据转QImage、HObject、Mat

love_android_hehe的专栏 2794

【异常】Antigravity IDE 登录异常与网络连接错误排查指南

在使用 Google 推出的 AI 原生 IDE时,部分用户可能会遇到身份验证失效与网络环境冲突导致的叠加错误。本文将针对此类典型故障提供完整的解决思路。

奶爸的编程之路,也就一周冷个三天 1711

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

别再为图像格式转换头疼了!一份代码搞定大恒相机到Bitmap、HObject、Mat、QImage的全链路转换(附避坑点)

本文详细介绍了工业视觉开发中如何高效实现大恒相机图像数据到Bitmap、HObject、Mat和QImage的全链路格式转换,涵盖C#和C++/Qt平台实战代码,并提供了内存管理、Bayer解码优化等关键性能优化策略,帮助开发者解决多平台适配中的常见问题。

asdfghjkl978564的博客 357

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

视觉检测中HObject、Mat和QImage图像格式转换源码(Halcon和OpenCV)

视觉检测中HObject、Mat和QImage图像格式转换源码(Halcon和OpenCV) 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了用于实现图像格式转换功能的源码,具体涵盖以下特点: 实现了HObject、Mat、QImage三种图像格式之间的相互转换。 支持处理8位图像以及24位RGB图像的转换。 可以将Halcon窗口和OpenCV窗口绑定至Qt控件上...

gitblog_06791的博客 687

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

跨平台图像处理:QImage、cv::Mat与HalconCpp::HObject高效转换实战

本文详细探讨了QImage、cv::Mat与HalconCpp::HObject三种图像格式在跨平台开发中的高效转换方法。通过实战案例和性能优化技巧,帮助开发者解决工业视觉项目中常见的颜色通道错乱、内存泄漏等问题,提升图像处理效率。重点介绍了零拷贝技术和异步转换框架设计,适用于Qt、OpenCV和Halcon的协同工作场景。

weixin_28273593的博客 360

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 玄学之 qt statusbar中添加Qlabel
下一篇: 网址收藏
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值