Qt image resource is null
-
On the command line directly
-
Ah, ok so I ran:
QT_DEBUG_PLUGINS=1 ./program
and it dumped a bunch of info. I'm not seeing any problems or failures in here...?Got keys from plugin meta data ("ico", "cur") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/aarch64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" Found metadata in lib /usr/lib/aarch64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "jpg", "jpeg" ], "MimeTypes": [ "image/jpeg", "image/jpeg" ] }, "className": "QJpegPlugin", "debug": false, "version": 330499 }
This seems like the most relevant portion, but again it seems to have succeeded in recognizing jpgs, so I don't see a problem. Let me know if there's anything else I should be looking for. I'm not seeing parts that are specific to my code, it just looks like Qt's background stuff for loading certain plugins.
-
@Kelenyche said in Qt image resource is null:
Ah, ok so I ran:
QT_DEBUG_PLUGINS=1 ./program
and it dumped a bunch of info. I'm not seeing any problems or failures in here...?Got keys from plugin meta data ("ico", "cur") QFactoryLoader::QFactoryLoader() looking at "/usr/lib/aarch64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" Found metadata in lib /usr/lib/aarch64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so, metadata= { "IID": "org.qt-project.Qt.QImageIOHandlerFactoryInterface", "MetaData": { "Keys": [ "jpg", "jpeg" ], "MimeTypes": [ "image/jpeg", "image/jpeg" ] }, "className": "QJpegPlugin", "debug": false, "version": 330499 }
This seems like the most relevant portion, but again it seems to have succeeded in recognizing jpgs, so I don't see a problem. Let me know if there's anything else I should be looking for. I'm not seeing parts that are specific to my code, it just looks like Qt's background stuff for loading certain plugins.
This chunk also seems like it recognized that it needs jpgs:
Got keys from plugin meta data ("svg", "svgz") QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/Desktop/program/imageformats" ... loaded library "/usr/lib/aarch64-linux-gnu/qt5/plugins/imageformats/libqjpeg.so" QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/aarch64-linux-gnu/qt5/plugins/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/Desktop/program/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/aarch64-linux-gnu/qt5/plugins/accessiblebridge" ... QFactoryLoader::QFactoryLoader() checking directory path "/home/pi/Desktop/program/accessiblebridge" ... QFactoryLoader::QFactoryLoader() checking directory path "/usr/lib/aarch64-linux-gnu/qt5/plugins/iconengines" ... QFactoryLoader::QFactoryLoader() looking at "/usr/lib/aarch64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so" Found metadata in lib /usr/lib/aarch64-linux-gnu/qt5/plugins/iconengines/libqsvgicon.so, metadata= { "IID": "org.qt-project.Qt.QIconEngineFactoryInterface", "MetaData": { "Keys": [ "svg", "svgz", "svg.gz" ] }, "className": "QSvgIconPlugin", "debug": false, "version": 330499 }
-
That part looks good.
And I am guessing that it also says somewhere that the plugin was successfully loaded ?The next step: did you check that the file is a valid jpeg ?
-
Yea I can't find any problems in that debug info, no failures or anything.
I actually created the jpg in paint, it's literally just some scribbles. I have a .png I've been trying to use but no luck, so I wanted to try a different file type, with a differently formatted name to see if anything would change. I don't see how it wouldn't be a valid jpg, having just saved it from paint?
-
Getting really strange...
No special characters in the path ? Not that it should play a role but who knows...
If you use QFile to open it, does it work ?
-
Nope, the full path is: "/home/pi/Desktop/program/extra/images/scribble.jpg"
Alright I'm not familiar with QFile, but I used:
QFile testfile("/home/pi/Desktop/program/extra/images/scribble.jpg"); if(testfile.exists()) { outputTextBox->append("opened the file"); }
and it seems to have succeeded.
will testfile.exists() do the same test as isNull in QImage? -
No, it just confirms the existence of the file not whether it is valid.
Use the QImageReader class. It's lower level but may give you more information about what is going wrong.
-
-
Within the same application, do you have the same issue if you load a different QImage variable using the usual way ?
-
Ooh, I think I'm onto something. So the way my code was implemented, I read the image, did some resizing and stuff, then was checking if it was null after that, since my textbox wasn't added to the gui yet. I switched to QDebug since that's more handy, and moved that code up - it looks like my resizing stuff was causing the image to become null? I now have a not-resized image that's painting onto the background of the graph!
I'll post my full fix once I figure this out. :)
-
Yep, this chunk is causing it to become null:
int chart_width = static_cast<int>(splineChart->plotArea().width()); int chart_height = static_cast<int>(splineChart->plotArea().height()); int view_width = static_cast<int>(splineChartView->width()); int view_height = static_cast<int>(splineChartView->height()); scribble = scribble.scaled(QSize(chart_width, chart_height));
So in QImage::scaled, if width or height are zero, it returns a null QImage. For some reason, my width and height are returning 0, so that makes sense. Sorry for the wild goose chase, and thank you for your help!
-
Sorry to re-open this topic. I recently encountered the same issue. When using
QFile
to check file size, it returns the correct value. But when I useQImage
orQImageReader
, the size is alwaysQSize(0, 0)
ornull
.Not like @Kelenyche , I didn't call
QImage::scaled()
to manipulate the image size.Following @SGaist 's suggestion, I set the QT_DEBUG_PLUGINS=1 environment variable and run the program, the output didn't seem like to provide anything useful:
QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/platforms" ... QFactoryLoader::QFactoryLoader() looking at "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build-debug-visual- studio/plugins/platforms/qwindowsd.dll" Found metadata in lib C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build-debug-visual-studio/plugins/platform s/qwindowsd.dll, metadata= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "MetaData": { "Keys": [ "windows" ] }, "archreq": 1, "className": "QWindowsIntegrationPlugin", "debug": true, "version": 393728 } Got keys from plugin meta data QList("windows") QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/platforms" ... loaded library "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build-debug-visual-studio/plugins/platforms/qwin dowsd.dll" QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/platformthemes" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/platformthemes" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/styles" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/styles" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/accessible" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/imageformats" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/imageformats" ... qDebug: background image is null? true qDebug: background image size? QSize(0, 0) QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/plugins/accessiblebridge" ... QFactoryLoader::QFactoryLoader() checking directory path "C:/Users/zhongdongy/Workspace/repos/qt-family-hub/cmake-build- debug-visual-studio/accessiblebridge" ...
Note: this is a PNG file, so I assume it will not load the QJpeg plugin.
The
QFile::size()
function returns the file size correctly, so the embedded resource definitely exists and loaded.I'm using Qt6 with MSVC (something wrong when linking using mingw) on Windows 11 x64, and font resources have no such issue, only image files.
-
There is no Qt png plugin because the support for png is built-in in QtGui so no plugin needed. Therefore it's also not a plugin problem but a problem of your path passed to QFile.
-
@Christian-Ehrlicher Thanks for the response. But the path passed to
QFile
andQImage
orQImageReader
are exactly the same. Even when I use the following approach still cannot get a usableQImage
instance:QFile f(":/resources/images/default-background.png"); f.open(QIODevice::OpenModeFlag::ReadOnly); QByteArray byte_array = f.readAll(); qDebug() <<"Bytes length: " << byte_array.length(); QImage img = QImage::fromData(byte_array); qDebug() << "Is QImage instance null: " << img.isNull();
The output:
Bytes length: 277370 Is QImage instance null: true
So the path is definitely correct.
-
@zhongdongy What if you pass the path to the file into QImage constructor? Get rid of the middle man QByteArray.
-
Here is a sample demonstrating the issue I encountered: GitHub | qt-forum-samples/qimage-not-loading. It's based on the reply I posted above. I'm building this project using MSVC, so the
CMakeLists.txt
file has some extra jobs to copy the debug DLLs. -
Works fine for me after I removed the strange rcc custom command. You enabled CMAKE_AUTORCC so why to you the call rcc by yourself? Remove it and simply add application.qrc to your list of sources as described in the documentation of CMAKE_AUTORCC.