如何将图像加载到painter.drawimage函数

Posted

技术标签:

【中文标题】如何将图像加载到painter.drawimage函数【英文标题】:how to load image to painter.drawimage function 【发布时间】:2014-01-13 10:46:20 【问题描述】:

我已将图像存储在板子本地目录(/home/images/system/image.png)中

painter.drawimage 函数将 Qpoint 和 Qimage 作为参数传递。

painter.drawImage(QRect(100, 50, 100, 100), QImage("home/images/system/image.png"));

我可以在这里直接使用图像路径吗?如果我这样加载它不起作用 这是传递存储在板目录中的图像路径的正确方法吗?

【问题讨论】:

你应该使用资源:qt-project.org/doc/qt-5.0/qtcore/resources.html 如果我们存储本地目录,如何传递路径? 查看此讨论:***.com/questions/7741444/qt-how-to-access-resources 一个小问题,你在哪里画画?在小部件或 QImage 上?你什么时候画一幅画?是在paintEvent还是其他方法(初学者常见的错误)。 我在 Qimage 上作画。实际上我是在覆盖图像。 【参考方案1】:

您可以自己看到位置和您尝试加载的路径之间的不一致:

我已将图像存储在板子本地目录(/home/images/system/image.png)中

然后:

painter.drawImage(QRect(100, 50, 100, 100), QImage("home/images/system/image.png"))

您缺少绝对路径的前导斜杠。为什么您的程序目前无法运行,这是因为程序正在寻找相对于应用程序的图像,而不是绝对路径。

解决方案是对上述行进行如下小修复:

painter.drawImage(QRect(100, 50, 100, 100), QImage("/home/images/system/image.png"))
                                                    ^

但是,这只是一种快速的解决方法。在理想情况下,您不会真正加载这样的图像,尤其是不会从与运行应用程序的用户不同的主文件夹中加载。

如果您使用相同用户的主目录,则不会使用硬编码路径,而是使用来自QStandardPaths 的以下选项:

QStandardPaths::HomeLocation    8   Returns the user's home directory.

除非真的有必要,否则硬编码这样的长绝对路径是一种非常糟糕的做法,但这种情况很少见。

或者,您也可以将图像放在应用程序旁边,并按以下方式加载:

painter.drawImage(QRect(100, 50, 100, 100),
                  QImage(QString("%1/image.png")
                  .arg(QCoreApplication::applicationDirPath()));

根据QCoreApplication documentation for this method。

我可能会坚持最新的选项,或者至少是前面提到的没有硬编码的主路径。

当然,您也可以随时使用Qt resource system,但我认为在这种简单的情况下这有点过分,除非您希望将图像捆绑在一起以便您不需要部署它分别地。在这种情况下,您将编写如下内容:

painter.drawImage(QRect(100, 50, 100, 100), QImage(":/image.png"));

您的 .pro qmake 文件中的资源文件如下:

RESOURCES += myresourcefile.qrc

资源文件将包含如下内容:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>image.png</file>
</qresource>
</RCC>

【讨论】:

【参考方案2】:
    你缺少前斜线 在绘画事件中加载图像是不好的方法 试试这个:

 QImage img("/home/images/system/image.png");
 Q_ASSERT(!img.isNull());
 painter.drawImage(QRect(100, 50, 100, 100), img);

【讨论】:

我需要在资源文件夹中加载图片吗? 这里没有资源是一个选项。 IMO 它与您的问题无关。如果您在小部件中绘画,则将 QImage 设为该小部件的字段,以防止多次重新加载图像。此断言仅确保图像已正确加载,您的问题是路径中的拼写错误。【参考方案3】:

代替

painter.drawImage(QRect(100, 50, 100, 100), QImage("/home/images/system/charge1.png"));

你可以使用

QImage image("home/images/system/charge1.png");
painter.drawImage(rect, image);

在文档中你可以看到

QRectF target(10.0, 20.0, 80.0, 60.0);
QRectF source(0.0, 0.0, 70.0, 40.0);
QImage image(":/images/myImage.png");

QPainter painter(this);
painter.drawImage(target, image, source);

在链接处:http://qt-project.org/doc/qt-4.8/qpainter.html#drawImage-5

另外,我建议你在 Qt 中使用资源文件:

http://qt-project.org/doc/qt-5.0/qtcore/resources.html http://qt-project.org/doc/qt-4.8/designer-resources.html

【讨论】:

不要为你使用'u'。这是最烦人的写作类型之一

以上是关于如何将图像加载到painter.drawimage函数的主要内容,如果未能解决你的问题,请参考以下文章

Qt之图形(Source和Dest相互覆盖的取舍,真的很方便)

Opencv模板匹配

如何使用 Glide 将 svg 图像加载到图像视图

如何从 HTTP 请求将图像加载到 UIButton Swift

如何使用 Swift 3 将图像从 Rest Api 加载到视图中加载方法

如何将图像文件加载到 ImageView?