如何使用QT显示图像的一部分
How to show part of an image using QT?
所以,这是我的问题:我有一个非常大的图像,我想只显示它的特定部分。在用户按下特定的键后,我希望图像移动,显示它的另一部分。从图像的一部分到另一部分的过渡必须是平滑的,动画的。
我尝试使用QLabel来显示图像,但它总是显示图像的中心,我真的不知道如何制作动画。你们有什么建议?
有趣的问题。这是我刚刚测试过的一些东西,似乎有效。
添加一个QGraphicsView
,尺寸为您想要显示的图像部分的尺寸,例如100x100。创建一个QGraphicsScene
并将其添加到视图:
QGraphicsScene* pScene = new QGraphicsScene(this);
ui->graphicsView->setScene(pScene);
现在将图像添加到场景中。在我的例子中,我的资源文件中有一个图像。诀窍是将sceneRect
设置为您想要显示的位置。我想显示图像的100x100部分,从0,300开始:
pItem = pScene->addPixmap(QPixmap::fromImage(QImage(":/photos/image")));
pScene->setSceneRect(0,300,100,100);
为了测试平滑移动,我添加了一个按钮,当点击时触发一个称为移动的插槽。这个槽只更新sceneRect
。在我的简单示例中,我只是将图像向右移动100像素。在现实场景中,您还可以将其沿对角线或垂直方向移动,并检查图像限制。
void move()
{
for (unsigned i=currentX; i<currentX + 100; i++)
{
ui->graphicsView->scene()->setSceneRect(i,300,100,100);
qApp->processEvents();
}
currentX += 100;
}
注意currentX
变量。它只不过是最后一个图像位置。此外,我们必须调用processEvents
,以便"看到"图像平滑地移动。
您可以使用QPixmap::copy(int x, int y, int width, int height)来复制图像的一个区域并显示该区域
几个选项:
- 尝试使用
Q3CanvasSprite
(在Q3Canvas
)。它的设计更多的是为了将一个图像分割成多个图像,而不是为了在它们之间进行动画。你可以尝试滥用它,并声明(比如)100帧(每个数字10帧,这将用作动画步骤),或者直接使用move()
方法。 - 尝试
QGraphicsPixmapItem::setOffset()
(在QGraphicsScene
内)。这可能是过度的,因为QGraphicsScene是为大量图像制作的)。
我不确定,但也许这可以用QStateMachine
和QAbstractAnimation
来完成。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- C++:如何使函数只返回作为列表一部分的字符串
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- OpenCV-如何将vale添加到图像一部分的所有像素
- OpenCV - 获取图像的一部分
- 如何在不同的矩阵中裁剪图像的一部分,但矩阵在 openCV 中不会改变其大小。
- OpenCV Filter2D:仅滤波矩阵/图像的一部分
- 如何在屏幕的一部分中插入图像
- 在 Allegro5 中绘制图像/字体的一部分
- 在 OpenCV 中加载图像的一部分
- 在 Direct2D 中绘制图像的一部分
- 如何使用QT显示图像的一部分
- 使用图像的一部分创建directx9纹理
- 图像作为源代码文档/注释的一部分