qt6里面没有Format_RGB24
There is no Format_RGB24 in qt6
在 QT5 中我们有 QVideoFrame::Format_RGB24
格式(我有没有 alpha 通道的 RGB 图像)。
在 QT6 (6.2.0) 中缺少此格式。
为什么删除了这种格式?
在 QT6 中转换 RGB -> RGBX (A) 的最佳方法是什么?
如果您使用的是 QImage(或者您可以将其转换为 QImage),那么您可以将格式转换为 QImage::Format_RGBX8888 然后复制位:
#include <QGuiApplication>
#include <QImage>
#include <QVideoFrame>
#include <QVideoFrameFormat>
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
QImage image(100, 100, QImage::Format_RGB888);
image.fill(QColor(50, 100, 200));
if(image.format() == QImage::Format_Invalid)
return EXIT_FAILURE;
QVideoFrameFormat video_frame_format(image.size(), QVideoFrameFormat::Format_RGBX8888);
QImage rgbx = image.convertToFormat(QVideoFrameFormat::imageFormatFromPixelFormat(video_frame_format.pixelFormat()));
QVideoFrame video_frame(video_frame_format);
if(!video_frame.isValid() || !video_frame.map(QVideoFrame::WriteOnly)){
qWarning() << "QVideoFrame is not valid or not writable";
return EXIT_FAILURE;
}
int plane = 0;
std::memcpy(video_frame.bits(plane), rgbx.bits(), video_frame.mappedBytes(plane));
video_frame.unmap();
qDebug() << video_frame << rgbx.format();
return EXIT_SUCCESS;
}
在 QT5 中我们有 QVideoFrame::Format_RGB24
格式(我有没有 alpha 通道的 RGB 图像)。
在 QT6 (6.2.0) 中缺少此格式。
为什么删除了这种格式? 在 QT6 中转换 RGB -> RGBX (A) 的最佳方法是什么?
如果您使用的是 QImage(或者您可以将其转换为 QImage),那么您可以将格式转换为 QImage::Format_RGBX8888 然后复制位:
#include <QGuiApplication>
#include <QImage>
#include <QVideoFrame>
#include <QVideoFrameFormat>
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
QImage image(100, 100, QImage::Format_RGB888);
image.fill(QColor(50, 100, 200));
if(image.format() == QImage::Format_Invalid)
return EXIT_FAILURE;
QVideoFrameFormat video_frame_format(image.size(), QVideoFrameFormat::Format_RGBX8888);
QImage rgbx = image.convertToFormat(QVideoFrameFormat::imageFormatFromPixelFormat(video_frame_format.pixelFormat()));
QVideoFrame video_frame(video_frame_format);
if(!video_frame.isValid() || !video_frame.map(QVideoFrame::WriteOnly)){
qWarning() << "QVideoFrame is not valid or not writable";
return EXIT_FAILURE;
}
int plane = 0;
std::memcpy(video_frame.bits(plane), rgbx.bits(), video_frame.mappedBytes(plane));
video_frame.unmap();
qDebug() << video_frame << rgbx.format();
return EXIT_SUCCESS;
}