- 主题:qt 5的QImage问题
确实限制总像素数不能超过16384 * 16384
不知道为什么要这样限制
static bool read_dib_infoheader(QDataStream &s, BMP_INFOHDR &bi)
{
s >> bi; // read BMP info header
if (s.status() != QDataStream::Ok)
return false;
int nbits = bi.biBitCount;
int comp = bi.biCompression;
if (!(nbits == 1 || nbits == 4 || nbits == 8 || nbits == 16 || nbits == 24 || nbits == 32) ||
bi.biPlanes != 1 || comp > BMP_BITFIELDS)
return false; // weird BMP image
if (!(comp == BMP_RGB || (nbits == 4 && comp == BMP_RLE4) ||
(nbits == 8 && comp == BMP_RLE8) || ((nbits == 16 || nbits == 32) && comp == BMP_BITFIELDS)))
return false; // weird compression type
if (bi.biWidth <= 0 || !bi.biHeight || quint64(bi.biWidth) * qAbs(bi.biHeight) > 16384 * 16384)
return false;
return true;
}
【 在 dormouseBHU 的大作中提到: 】
: 你这个确实打不开。是因为图像像素数超出 16384 * 16384 了,这个应该是 bmp 图像加载算法有限制。
: 下次你直接说像素数,你说30多兆的图像,我们都认为也就是几百万像素的图像。。。
: 解决办法可以存成 png 图片。
: ...................
--
FROM 60.168.247.*
刷新了对BMP的认识,原来BMP还可以这样搞,一直以为每个像素必须实例化呢。
【 在 dormouseBHU 的大作中提到: 】
: 你这个确实打不开。是因为图像像素数超出 16384 * 16384 了,这个应该是 bmp 图像加载算法有限制。
: 下次你直接说像素数,你说30多兆的图像,我们都认为也就是几百万像素的图像。。。
: 解决办法可以存成 png 图片。
: ...................
--
FROM 203.208.61.*
就是每个像素占24bit,也就是一个像素三个字节。
【 在 bigsen 的大作中提到: 】
: 24位真彩意思是单像素24通道么?
--
FROM 220.180.240.*
这个应该是从远古时代遗留的代码…
当年确实对像素数有限制。
【 在 flybb 的大作中提到: 】
: 确实限制总像素数不能超过16384 * 16384
: 不知道为什么要这样限制
: static bool read_dib_infoheader(QDataStream &s, BMP_INFOHDR &bi)
: ...................
--
FROM 220.180.240.*
他这个就是单色位图,一个bit表示一个像素,8个像素占用一个byte。bmp,png 都支持这种格式。tiff好像也支持。
【 在 bigsen 的大作中提到: 】
: 他这个分辨率(18912*15752)怎么是对应到bit上的?怎么不是我们通常理解的1920*1080的分辨率都是指的每一个像素是RGB 3个通道 每个通道1个字节,所以每个像素3个字节。他这种格式叫什么?也不叫24位真彩吧,24位真彩就是我们通常说的1080P这种吧。
--
FROM 220.180.240.*
1,4,8,24,32 bmp应该就支持这几个像素格式。
【 在 ble 的大作中提到: 】
: 刷新了对BMP的认识,原来BMP还可以这样搞,一直以为每个像素必须实例化呢。
:
--
FROM 220.180.240.*
这个可不是远古代码,查了下github,好像是2018年提交的,专门添加了这行检查,但
这个说明没有详细解释具体原因,感觉要找到bugzilla上具体的bug才能解释清楚:
+ if (bi.biWidth < 0 || quint64(bi.biWidth) * qAbs(bi.biHeight) > 16384 *
16384)
+ return false;
bmp image handler: check for out of range image size
Make the decoder fail early to avoid spending time and memory on
attempting to decode a corrupt image file.
Change-Id: I874e04f3b43122d73f8e58c7a5bcc4a741b68264
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
@aavit committed on 11 Sep 2018
https://github.com/qt/qtbase/commit/621ab8ab59901cc3f9bd98be709929c9eac997a8
【 在 flybb 的大作中提到: 】
: 确实限制总像素数不能超过16384 * 16384
: 不知道为什么要这样限制
: static bool read_dib_infoheader(QDataStream &s, BMP_INFOHDR &bi)
: ...................
--
修改:gameplayer FROM 222.128.5.*
FROM 222.128.5.*
看这个 commit 说明,这种代码太蠢了。。
【 在 gameplayer 的大作中提到: 】
: 这个可不是远古代码,查了下github,好像是2018年提交的,专门添加了这行检查,但
: 这个说明没有详细解释具体原因,感觉要找到bugzilla上具体的bug才能解释清楚:
: + if (bi.biWidth < 0 || quint64(bi.biWidth) * qAbs(bi.biHeight) > 16384 *
: ...................
--
FROM 124.72.111.*
那我们普通相机、摄像头拍摄的,720P,1080P,不都属于24位真彩咯?
【 在 dormouseBHU 的大作中提到: 】
: 就是每个像素占24bit,也就是一个像素三个字节。
--
FROM 39.148.227.*
真彩对应的是硬件比如显示器的能力。还有图像在显存中的形态。对于照片来说没有所谓真彩这一说吧。比如jpg,存储的都不是RGB,就无所谓真彩一说了。
黑白图像显示到彩色显示器上也是真彩的啊。
【 在 bigsen 的大作中提到: 】
: 那我们普通相机、摄像头拍摄的,720P,1080P,不都属于24位真彩咯?
--
FROM 36.5.241.*