关于QImage图像显示问题!!!在线等~~~

yang580231 2014-10-14 09:37:40
在做案例过程中,遇到一种情况,有一张PNG格式的图片,尺寸是768*576像素,现在想利用C二进制读文件的方式,将其读到内存中,然后利用QImage::fromData();函数将都入到内存中的数据转换成一张图片显示。但是在转换的过程中出现了错误,导致显示不了,大家有啥这方面的经验么???


我也做了个小测试,直接利用QImage加载此图片,然后调用byteCount()函数,返回的字节数是768*576*4,与图片本身占用windows的空间不一致,前者是后者的接近8倍大小,这是为什么呢???
...全文
1318 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
盘子饿了 2014-10-23
  • 打赏
  • 举报
回复
你直接把整个文件读进来会包含图片文件的头信息,不仅仅是图像数据。 png包含图片头信息和压缩过的数据,而byteCount()返回的是width*height*depth,是和图像解析度以及深度有关。
dext 2014-10-16
  • 打赏
  • 举报
回复
我说明显是 3 不对,你不回头去看API, QImage ( uchar * data, int width, int height, int bytesPerLine, Format format ) 麻烦你能给我翻译一下 bytesPerLine 么?
yang580231 2014-10-16
  • 打赏
  • 举报
回复
引用 15 楼 dbzhang800 的回复:
[quote=引用 14 楼 Inhibitory 的回复:] [quote=引用 13 楼 u014374166 的回复:] [quote=引用 9 楼 Inhibitory 的回复:] QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
还想问下,如果PNG的位深度是48的话,那么format的设置该是多少?[/quote] 没有听过PNG位深度是48这种说法,PNG就是32位的,ARGB格式。[/quote] png 格式有 48 和 64 bit的深度,但是QImage不支持这种但单通道16bit的 RGB和RGBA格式。需要转换成 24 和 32 深度。 另外, QImage 的构造函数QImage(uchar*, ...),和 loadFromData() 适用的场合完全不同,不能将二者混为一谈 [/quote] 我现在遇到一个实际的问题是,实时视频采集卡采集来的数据有720*576*2 Byte数量,我使用QImage的loadFromData来构建一个QImage对象的话,需要160ms,这样的话1s才可以显示6桢左右的图像,不能达到25桢的显示要求,您有什么建议能够减少这段时间的消耗呢??
dbzhang800 2014-10-16
  • 打赏
  • 举报
回复
引用 14 楼 Inhibitory 的回复:
[quote=引用 13 楼 u014374166 的回复:] [quote=引用 9 楼 Inhibitory 的回复:] QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
还想问下,如果PNG的位深度是48的话,那么format的设置该是多少?[/quote] 没有听过PNG位深度是48这种说法,PNG就是32位的,ARGB格式。[/quote] png 格式有 48 和 64 bit的深度,但是QImage不支持这种但单通道16bit的 RGB和RGBA格式。需要转换成 24 和 32 深度。 另外, QImage 的构造函数QImage(uchar*, ...),和 loadFromData() 适用的场合完全不同,不能将二者混为一谈
Inhibitory 2014-10-16
  • 打赏
  • 举报
回复
引用 13 楼 u014374166 的回复:
[quote=引用 9 楼 Inhibitory 的回复:] QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
还想问下,如果PNG的位深度是48的话,那么format的设置该是多少?[/quote] 没有听过PNG位深度是48这种说法,PNG就是32位的,ARGB格式。
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 9 楼 Inhibitory 的回复:
QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
还想问下,如果PNG的位深度是48的话,那么format的设置该是多少?
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 9 楼 Inhibitory 的回复:
QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
嗯,是的。已经学习了,但还有一事想问,我在用C以二进制方式读入一张PNG格式的图片(按照您举例的8K大小),保存到一个内存区域中,然后利用loadFromData可以正确的加载成功,但是同样的内存区域使用QImage的构造函数,传递width,height,format等进入的时候,发现图片不能成功的显示,我想请问一下,那我此时的formmat该如何设置呢?是设置成32位的还是24位的?
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 8 楼 dbzhang800 的回复:
[quote=引用 2 楼 u014374166 的回复:] [quote=引用 1 楼 dbzhang800 的回复:] 第一个问题,没有代码,无法判断你哪儿弄错了。 第二个问题,png相当于压缩后的位图数据,QImage读取相当于解压缩,二者大小不同再正常不过了。
FILE * f = fopen("d:/1.png","rb");
    if(f==NULL){
        printf("image open error!\n");
        exit(-1);
    }else{
        printf("image open success!!!\n");
    }

    fseek(f,0,SEEK_END);
    long length = ftell(f);
//     printf("file length : %d\n",length);

    char * p = new char[length];

    fgets(p,length,f);

    uchar * q = new uchar[length];

    memcpy(q,p,length);

  /*  QImage image(q,768,576,3,QImage::Format_ARGB6666_Premultiplied);*/
[/quote] 首先,fgets 用在这儿不对。 其次,p 分配的大小不对。 再次,q 有必要重新分配内容再拷贝么?为什么不直接用一个p或q[/quote]fgets确实不对,换成fread就好,q的存在主要是测试memcpy拷贝的时间,没有其他的意思。
dbzhang800 2014-10-15
  • 打赏
  • 举报
回复
引用 4 楼 dext 的回复:
bytesPerLine 明显不可能是3。 为啥不用 QFile + QByteArray?
他不是说的用的fromData么,怎么代码中给出了一个注释掉的、错误的构造函数。猜不出他到底怎么用的。
Inhibitory 2014-10-15
  • 打赏
  • 举报
回复
QImage::fromData(..) 这个data需要有图片的头文件信息,不只是图片的像素信息。 png每个像素是4个字节,不是3个。 png存储在硬盘上有的是压缩过的,例如一张 600 * 100 的纯色 png 图片可能是8K 大小,但是非纯色的有可能是47K。 不过他们读入到内存后占用的大小都是一样的 600 * 100 * 4 (额外还要加上信息头占用的空间,也是一样大小的)
dbzhang800 2014-10-15
  • 打赏
  • 举报
回复
引用 2 楼 u014374166 的回复:
[quote=引用 1 楼 dbzhang800 的回复:] 第一个问题,没有代码,无法判断你哪儿弄错了。 第二个问题,png相当于压缩后的位图数据,QImage读取相当于解压缩,二者大小不同再正常不过了。
FILE * f = fopen("d:/1.png","rb");
    if(f==NULL){
        printf("image open error!\n");
        exit(-1);
    }else{
        printf("image open success!!!\n");
    }

    fseek(f,0,SEEK_END);
    long length = ftell(f);
//     printf("file length : %d\n",length);

    char * p = new char[length];

    fgets(p,length,f);

    uchar * q = new uchar[length];

    memcpy(q,p,length);

  /*  QImage image(q,768,576,3,QImage::Format_ARGB6666_Premultiplied);*/
[/quote] 首先,fgets 用在这儿不对。 其次,p 分配的大小不对。 再次,q 有必要重新分配内容再拷贝么?为什么不直接用一个p或q
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 4 楼 dext 的回复:
bytesPerLine 明显不可能是3。 为啥不用 QFile + QByteArray?
我也试了一下,将fgets()来的数据构造一个QByteArray对象,然后在构造QImag,但是在构造QByteArray时返回的长度只有1.
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 4 楼 dext 的回复:
bytesPerLine 明显不可能是3。 为啥不用 QFile + QByteArray?
bytesPerLine不是说颜色的存储按照3字节的么,也就是24位颜色存储。因为这个是项目中所遇到的的要求,只能用C以二进制文件读写方式读到内存中,然后再用QImage转换一下。那还有解决方式么?帮帮忙!谢谢了~
yang580231 2014-10-15
  • 打赏
  • 举报
回复
引用 3 楼 sourire_will 的回复:
p、q少一个字符串结束标志
我刚才试了一下,还是不行欸!
dext 2014-10-14
  • 打赏
  • 举报
回复
bytesPerLine 明显不可能是3。
为啥不用 QFile + QByteArray?
sourire_will 2014-10-14
  • 打赏
  • 举报
回复
p、q少一个字符串结束标志
yang580231 2014-10-14
  • 打赏
  • 举报
回复
引用 1 楼 dbzhang800 的回复:
第一个问题,没有代码,无法判断你哪儿弄错了。 第二个问题,png相当于压缩后的位图数据,QImage读取相当于解压缩,二者大小不同再正常不过了。
FILE * f = fopen("d:/1.png","rb");
    if(f==NULL){
        printf("image open error!\n");
        exit(-1);
    }else{
        printf("image open success!!!\n");
    }

    fseek(f,0,SEEK_END);
    long length = ftell(f);
//     printf("file length : %d\n",length);

    char * p = new char[length];

    fgets(p,length,f);

    uchar * q = new uchar[length];

    memcpy(q,p,length);

  /*  QImage image(q,768,576,3,QImage::Format_ARGB6666_Premultiplied);*/
dbzhang800 2014-10-14
  • 打赏
  • 举报
回复
第一个问题,没有代码,无法判断你哪儿弄错了。 第二个问题,png相当于压缩后的位图数据,QImage读取相当于解压缩,二者大小不同再正常不过了。

16,154

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧