尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?

Trying to split an image into several blocks with QPixmap from the Qt lib. Is there anything I don't understand about the way his copy method works?

本文关键字:工作 方式 方法 复制 于他 明白 什么 Qt QPixmap 拆分 图像      更新时间:2023-10-16

我想在3x3、4x4或5x5大小的qgridlayout中排列图像的片段(400px x 400px(,以完全表示它。我使用qpixMap中的Qlist存储每个片段。此列表中充满了一个函数,其中我输入完整映像的qpixMap和所需的剪切尺寸。

CustomWidget Attribut:

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 ctor:

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个块时,图像的一部分似乎会重复。(我明确将调试线留在代码中(

如果有人可以帮助我,那真的很好。预先感谢您关注这个问题。

来自文档中您使用的成员函数的文档被声明为...

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

因此,第三和第4个参数分别是宽度和高度 - 而不是您似乎假设的右下角的坐标。更改...

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

to ...

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