gpt4 book ai didi

c++ - 尝试使用 Qt 库中的 QPixmap 将图像分成几个 block 。他的复制方法的工作方式有什么我不明白的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:52 25 4
gpt4 key购买 nike

我想在 3x3、4x4 或 5x5 大小的 QGridLayout 中排列图像片段 (400px x 400px) 以完整地表示它。我使用 QPixmap 中的 QList 来存储每个片段。这个列表充满了一个函数,我在其中输入完整图像的 QPixmap 和所需的切割尺寸。

CustomWidget 属性:

QList<QPixmap> imgFragments;

相关方法:

void CustomWidget::fragmentImage(const QPixmap &pm, int cuttingNumber) {

int fragmentSize = pm.height() / cuttingNumber;

for (int i = 0; i < boardSize; ++i) {
for (int j = 0; j < boardSize; ++j) {
int x0 = i * fragmentSize;
int y0 = j * fragmentSize;
int x1 = x0 + fragmentSize;
int y1 = y0 + fragmentSize;
imgFragments.push_back(pm.copy(x0, y0, x1, y1));
qDebug() << x0 << ", " << y0 << ", " << x1 << ", " << y1 << endl;
}
}
}

CustomWidget 构造函数:

Widget::Widget(QWidget* parent) : QWidget(parent)
{
setFixedSize(400, 400);

QPixmap pm;
if (!pm.load(":/img"))
qDebug() << "NULL" << endl;

QGridLayout* layout = new QGridLayout;
setLayout(layout);

int cuttingNumber = 4;

fragmentImagePixmap(pm, cuttingNumber);

int gap = 0;
for (int i = 0; i < cuttingNumber; ++i) {
for (int j = 0; j < cuttingNumber; ++j) {
QLabel* lbl = new QLabel;
lbl->setPixmap(imgFragmentsPixmap.at(gap + j));
layout->addWidget(lbl, j, i);
}
gap += cuttingNumber;
}
}

不幸的是,我通过以 4x4 切割图像来进行测试时遇到了问题。 for 循环中使用的尺寸似乎不错,但是当显示 16 个 block 时,图像的某些部分似乎重复了。 (我明确地在代码中留下了我的调试行)

如果有人能帮助我,那就太好了。预先感谢您关注该问题。

最佳答案

来自documentation您正在使用的成员函数声明为...

QPixmap QPixmap::copy(int x, int y, int width, int height) const

所以第三个和第四个参数分别是宽度和高度——而不是你假设的右下角的坐标。改变...

imgFragments.push_back(pm.copy(x0, y0, x1, y1));

为了...

imgFragments.push_back(pm.copy(x0, y0, fragmentSize, fragmentSize));

关于c++ - 尝试使用 Qt 库中的 QPixmap 将图像分成几个 block 。他的复制方法的工作方式有什么我不明白的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57345866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com