qml grabToImage saveToFile在Android上返回false在桌面上返回true
以下qml(QtQuick 2.7)代码在桌面(Linux、Windows、OSX)上返回true,但在Android和ios上返回false(用于写入外部存储的Android权限在Manifest.Xml中设置) 移动设备上的代码有什么问题?(imagePath已正确解析为标准图片位置,即Android上的存储/模拟/0/图片) 调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告 如果我是你,我会将qml grabToImage saveToFile在Android上返回false在桌面上返回true,android,ios,qt,qml,qtquick2,Android,Ios,Qt,Qml,Qtquick2,以下qml(QtQuick 2.7)代码在桌面(Linux、Windows、OSX)上返回true,但在Android和ios上返回false(用于写入外部存储的Android权限在Manifest.Xml中设置) 移动设备上的代码有什么问题?(imagePath已正确解析为标准图片位置,即Android上的存储/模拟/0/图片) 调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告 如果我是你,我会将QImage::save()的定义更改为以下内容,然后构建qtbase: bool
QImage::save()
的定义更改为以下内容,然后构建qtbase:
bool QImage::save(const QString &fileName, const char *format, int quality) const
{
if (isNull())
return false;
QImageWriter writer(fileName, format);
const bool saved = d->doImageIO(this, &writer, quality);
qDebug() << writer.errorString();
return saved;
}
一旦知道图像无法保存的原因,就可以删除此代码。调用,不幸的是,除了bool返回值之外,它没有任何类型的错误报告
如果我是你,我会将QImage::save()
的定义更改为以下内容,然后构建qtbase:
bool QImage::save(const QString &fileName, const char *format, int quality) const
{
if (isNull())
return false;
QImageWriter writer(fileName, format);
const bool saved = d->doImageIO(this, &writer, quality);
qDebug() << writer.errorString();
return saved;
}
一旦知道图像无法保存的原因,就可以删除此代码。文档中说“如果无法启动抓取,函数将返回false。”。所以再说一遍:为什么抓取不是在安卓上启动的?安卓的哪个版本?在清单中设置权限已经不够了,您需要转到设置->应用->应用并启用存储权限,或者需要使用QAndroidJniObject请求运行时权限。您是否尝试写入QStandardPath::可写位置(QStandardPath::AppDataLocation)?您应该可以在没有存储许可的情况下执行此操作谢谢Mark,我将尝试您的两个建议,看看哪一个更适合我的应用程序。文档中说“如果无法启动抓取,函数将返回false。”。所以再说一遍:为什么抓取不是在安卓上启动的?安卓的哪个版本?在清单中设置权限已经不够了,您需要转到设置->应用->应用并启用存储权限,或者需要使用QAndroidJniObject请求运行时权限。您是否尝试写入QStandardPath::可写位置(QStandardPath::AppDataLocation)?你应该能够做到这一点,没有存储许可,谢谢你,马克,我会尝试两个建议,看看哪一个更适合我的应用程序。我会尝试QiFieWrrime-但作为一个相对初学者,我不知道如何调用C++从QML。如何把GruttoIsAm的结果传递给QiFixFrror。哦,对了,我忘了提到你可以直接从C++中做这件事。我再举一个例子,非常感谢,这很有效。现在我收到了这样一条信息:无法写入图像:“无法打开设备进行写入:权限被拒绝”我想我必须寻找合适的Android(和ios)权限。顺便说一句:我不得不更改代码的前两行:
QImage图像(100100,QImage::Format_Mono);QImageWriter imageWriter(imagePath.toString()+“/test.png”,“png”)代码>…在ios上,消息读取无法写入图像:“无法打开设备进行写入:没有这样的文件或目录”-可能imagePath错误-我的代码:QUrl imagePath;常量QStringList picturesLocation=qstandardpath::standardplocations(qstandardpath::picturesLocation);if(picturesLocation.isEmpty())imagePath=appPath.resolved(QUrl(“图像”));else imagePath=QString(“%1”).arg(picturesLocation.first())代码>我会尝试QiFieWrrime-但作为一个相对初学者,我不知道如何调用QC++从QML。如何把GruttoIsAm的结果传递给QiFixFrror。哦,对了,我忘了提到你可以直接从C++中做这件事。我再举一个例子,非常感谢,这很有效。现在我收到了这样一条信息:无法写入图像:“无法打开设备进行写入:权限被拒绝”我想我必须寻找合适的Android(和ios)权限。顺便说一句:我不得不更改代码的前两行:QImage图像(100100,QImage::Format_Mono);QImageWriter imageWriter(imagePath.toString()+“/test.png”,“png”)代码>…在ios上,消息读取无法写入图像:“无法打开设备进行写入:没有这样的文件或目录”-可能imagePath错误-我的代码:QUrl imagePath;常量QStringList picturesLocation=qstandardpath::standardplocations(qstandardpath::picturesLocation);if(picturesLocation.isEmpty())imagePath=appPath.resolved(QUrl(“图像”));else imagePath=QString(“%1”).arg(picturesLocation.first())代码>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
// Add this...
#include <QImage>
#include <QImageWriter>
#include <QDebug>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
// ... and this
QImage image("path/to/my/image.png");
QImageWriter imageWriter;
if (!imageWriter.write(image)) {
qDebug() << "Failed to write image:" << imageWriter.errorString();
}
return app.exec();
}