QT从5.12版本开始,增加了QImage::Format_RGBX64、QImage::Format_RGBA64、QImage::Format_RGBA64_Premultiplied等一系列图像格式,使得显示16位位深色彩图像成为可能,读写16位tiff图像终于不用先放缩到8位再显示了(泪目);从5.13版本开始增加了QImage::Format_Grayscale16这种16位位深灰度图像格式。
构造图像
构造16位图像,原始数据应是ushort类型而不是8位图像时的uchar类型,单个色彩的范围为0~65535而不是之前的0~255。添加图像数据时,原本使用setPixelColor()设置QRgba64类型的色彩,发现程序的运行效率不高,构造图像的时间比较长。事实上,QT自己的官方文档都说了setPixelColor()是一个效率很低的函数,不建议使用它来构造图像。
1 QImage tempImg = QImage(width, height, QImage::Format_RGBX64);
2
3 int bitCount = 0,index= 0;
4 ushort nowColor;
5 for (int j = 0; j < height; j++)
6 {
7 for (int i = 0; i < width; i++)
8 {
9 //放缩数据到0~65535,orignalData为float类型
10 nowColor = (ushort)((orignalData[index] - limitMin) * 65535 / (limitMax - limitMin));
11 index++;
12
13 //注:setPixelColor()函数是非常耗时的操作
14 uchar* bit = tempImg.scanLine(j) + i * 8;
15 memcpy(bit, &nowColor, 2);
16 memcpy(bit+2, &nowColor, 2);
17 memcpy(bit+4, &nowColor, 2);
18 ushort maxNum = 0xffff;
19 memcpy(bit + 6, &maxNum, 2);
20 //tempImg.setPixelColor(i, j, QColor::fromRgba64(nowColor, nowColor, nowColor));
21 }
22 }
显示图像
运行程序后,发现16位位深图像和之前的8位位深图像并没有太大的区别,一度怀疑自己没写正确。后来发现是自己电脑显示器只能显示8位位深图像的缘故。实际上,现在大部分的电脑都还只能显示8位位深图像,改不改成16位位深图像,看自己的硬件配置(以及老板的要求)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2020-12-09 Qt QSemaphore使用详解