Qt - 无法将 QImage 导出为 16 位 bmp
Qt - Cannot export QImage to 16bit bmp
我创建了一个简单的应用程序,我需要从 pixmap 导出到 16 位 bmp 图像。我有几个像素图项目,所以我有这样的 for 循环,我首先创建 QImage 并将其转换为 Format_RGB16:
for(QList<image_handler * >::iterator it=imageItems->begin(); it!=imageItems->end(); it++)
{
...
// image_handler inherits QPixmap
QFile export_image(path+"/img_"+code+".bmp");
QImage export_img = (*it)->toImage().convertToFormat(QImage::Format_RGB16);
export_img.save(&export_image, "BMP");
...
}
其中 image_handler 是我的自定义 QPixmap。图像以给定的路径导出,文件名正确。但是,当我查看文件属性(在 windows 中)时,我可以看到图像深度是 24 位。不幸的是,我需要它们是 16 位的。
我这里做错了什么?或者这是 Qt 中的错误?那么如何从像素图中导出16位bmp?
事实证明,Qt 在将图像保存为 bmp 之前强制转换图像。
qt-src/src/gui/image/qbmphandler.cpp:777:
bool QBmpHandler::write(const QImage &img)
{
QImage image;
switch (img.format()) {
case QImage::Format_ARGB8565_Premultiplied:
case QImage::Format_ARGB8555_Premultiplied:
case QImage::Format_ARGB6666_Premultiplied:
case QImage::Format_ARGB4444_Premultiplied:
image = img.convertToFormat(QImage::Format_ARGB32);
break;
case QImage::Format_RGB16:
case QImage::Format_RGB888:
case QImage::Format_RGB666:
case QImage::Format_RGB555:
case QImage::Format_RGB444:
image = img.convertToFormat(QImage::Format_RGB32);
break;
default:
image = img;
}
...
因此,如果您需要保存 bmp 16 位,则必须手动完成,填写 header 并使用 QImage::bits()
和 QImage::byteCount()
。
我创建了一个简单的应用程序,我需要从 pixmap 导出到 16 位 bmp 图像。我有几个像素图项目,所以我有这样的 for 循环,我首先创建 QImage 并将其转换为 Format_RGB16:
for(QList<image_handler * >::iterator it=imageItems->begin(); it!=imageItems->end(); it++)
{
...
// image_handler inherits QPixmap
QFile export_image(path+"/img_"+code+".bmp");
QImage export_img = (*it)->toImage().convertToFormat(QImage::Format_RGB16);
export_img.save(&export_image, "BMP");
...
}
其中 image_handler 是我的自定义 QPixmap。图像以给定的路径导出,文件名正确。但是,当我查看文件属性(在 windows 中)时,我可以看到图像深度是 24 位。不幸的是,我需要它们是 16 位的。
我这里做错了什么?或者这是 Qt 中的错误?那么如何从像素图中导出16位bmp?
事实证明,Qt 在将图像保存为 bmp 之前强制转换图像。
qt-src/src/gui/image/qbmphandler.cpp:777:
bool QBmpHandler::write(const QImage &img)
{
QImage image;
switch (img.format()) {
case QImage::Format_ARGB8565_Premultiplied:
case QImage::Format_ARGB8555_Premultiplied:
case QImage::Format_ARGB6666_Premultiplied:
case QImage::Format_ARGB4444_Premultiplied:
image = img.convertToFormat(QImage::Format_ARGB32);
break;
case QImage::Format_RGB16:
case QImage::Format_RGB888:
case QImage::Format_RGB666:
case QImage::Format_RGB555:
case QImage::Format_RGB444:
image = img.convertToFormat(QImage::Format_RGB32);
break;
default:
image = img;
}
...
因此,如果您需要保存 bmp 16 位,则必须手动完成,填写 header 并使用 QImage::bits()
和 QImage::byteCount()
。