c++ - 如何用 PPM 格式的 uchar* 数组填充 QPixmap

标签 c++ qt

我以 PPM 格式 (255 255 255) 生成点颜色数组。如何在像素图中显示它?

如果我用蓝色填充像素图 (m_pixmap.fill(Qt::blue)) 程序会为我绘制一个蓝色方 block ,但是当我尝试加载 PPM 图像时,我得到没有任何图像的空白空间。

我正在以这种方式加载 ppm:

ImageViewer::ImageViewer(QWidget * pi_parent)
  : QLabel{ QString{"ImageViewer" }, pi_parent }
  , m_pixmap{ 3, 2}
{
  m_pixmap.fill(Qt::blue);
  unsigned char data[] = {
    'P3',
    '3', '2',
    '255',
    '255', '0', '0',
    '0', '255', '0',
    '0', '0', '255',
    '255', '255', '0',
    '255', '255', '255',
    '0', '0', '0'
  };
  m_pixmap.loadFromData(data, sizeof(data), "PPM");
  this->setScaledContents(true);
  this->setPixmap(m_pixmap);
}

如何根据颜色数组设置 PPM 图像? (不从文件中读取)

最佳答案

首先你必须明白 PPM 是一些图像的文本表示。现在您的 data 设置不正确,这就是加载失败的原因(缺少空格或换行符会使该文本不可读)。

它可以像这样(使用 c++17 std::string_view):

using namespace std::string_view_literals;

// this is a string view created from raw string literal
constexpr auto ppmImageData = R"(P3
3 2
255
255   0 0      0 255   0    0 0 255
255 255 0    255 255 255    0 0   0
)"sv;

ImageViewer::ImageViewer(QWidget * pi_parent)
  : QLabel{ QString{"ImageViewer" }, pi_parent }
  , m_pixmap{ 3, 2}
{
  m_pixmap.loadFromData(ppmImageData.data(), ppmImageData.size(), "PPM");
  this->setScaledContents(true);
  this->setPixmap(m_pixmap);
}

删除 std::string_view(如果您没有 C++17)非常简单:只需删除 sv 后缀并更正 loadFromData< 的参数 调用。

关于c++ - 如何用 PPM 格式的 uchar* 数组填充 QPixmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696630/

相关文章:

c# - 如何从 C++ 函数库调用 .Net COM+ 对象?

C++:无法通过传递给查找器函数来重新分配空初始化的对象指针

java - 获取音频输出设备(扬声器、耳机)的 GUID

c++ - 在 QStackedWidget Item 中通过键盘导航

c++ - QT .png 文件未显示在屏幕上

c++ - 为什么这个程序会导致段错误?

c++ - 巧妙破坏的 C++ 代码的邪恶样本

qt - 如何在Qt中通过以太网播放流音频?

qt - 如何使用 QString 指定 unicode 字符?

c++ - Qt插件: is there a way to list all interfaces a plugin implements?