Save QImage from BYTE buffer segfaults ?
-
Hi, I have a BYTE buffer that gets populated with data representing an image. I want to save that data as a .BMP image file on disk:
BYTE *buf = new BYTE(imWidth * imHeight); //Populate buf with data using API call here (not shown) QImage img(buf, imWidth, imHeight, QImage::Format_Grayscale8); img.save("image.bmp", "BMP"); delete [] buf;
It works absolutely fine sometimes. Other times it crashes when saving the image and generates an empty .bmp file.
I can't understand why it sometimes works and other times it doesn't ?
-
Hi,
Are you sure you are putting valid data in there before making a QImage out of it ?
Are you sure the buffer stays valid until the file is written ? -
FWIW, you cannot make the absolute assumption that buf will be 32bit word aligned. If I had to guess, that would be my guess as to why it crashes sometimes. The Qt docs ae specific about the need for buf to be 32bit word aligned.
-
@SGaist said in Save QImage from BYTE buffer segfaults ?:
Hi,
Are you sure you are putting valid data in there before making a QImage out of it ?
Are you sure the buffer stays valid until the file is written ?I'm pretty sure that the buffer stays valid.
The data is always written to the buffer the same way, but I guess it could be invalid. How would I check that after the buffer has been populated ?
-
@Kent-Dorfman said in Save QImage from BYTE buffer segfaults ?:
FWIW, you cannot make the absolute assumption that buf will be 32bit word aligned. If I had to guess, that would be my guess as to why it crashes sometimes. The Qt docs ae specific about the need for buf to be 32bit word aligned.
Yes I saw that in the documentation. I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.
Does Qt have any other way to get around this besides using another image processing library to save the image ?
-
What are you using to fill that buffer ?
Where do these data come from ? -
@SGaist said in Save QImage from BYTE buffer segfaults ?:
What are you using to fill that buffer ?
Where do these data come from ?It's populated using an API call which finishes successfully. So I can only interrogate the validity of the data after its completed.
-
That's a bit short on details. An API call can be a method from a library your are using or a remote call to a REST service.
What kind of image are you getting ?
-
@R-P-H said in Save QImage from BYTE buffer segfaults ?:
I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.
Even if it does it would depend on your image size (or better: bytes per line). If it's a multiple of 4 it does not crash, if it's something else the alignment is wrong.
-
@SGaist said in Save QImage from BYTE buffer segfaults ?:
That's a bit short on details. An API call can be a method from a library your are using or a remote call to a REST service.
What kind of image are you getting ?
It's from a library. The API reference is very short on details. It's a 256 gray-level image.
-
@Christian-Ehrlicher said in Save QImage from BYTE buffer segfaults ?:
@R-P-H said in Save QImage from BYTE buffer segfaults ?:
I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.
Even if it does it would depend on your image size (or better: bytes per line). If it's a multiple of 4 it does not crash, if it's something else the alignment is wrong.
The image size is always the same (260 x 300 px).
-
And one byte per pixel ?
-
Can you get the stack trace of the crash ?
-
-
Windows machine ?
-
@mranger90 said in Save QImage from BYTE buffer segfaults ?:
try:
BYTE *buf = new BYTE[imWidth * imHeight];Hi, it is not crashing anymore, however the image seems to be coming out completely black. I will confirm tomorrow if the image is supposed to be completely black or not...
-
From the documentation
https://doc.qt.io/qt-5/qimage.html#QImage-4
data must be32-bit aligned
, and each scanline of data in the image must also be32-bit aligned
.So (as far as I understand) that is not enough to have memory buffer aligned to 32 bit address, also each line have to be aligned to 32 bit address. So if you have image that is 260x300 pixels, a whole line will take 288 bytes. So for whole image you should have 288*300 bytes which is more than you have provided.