Maximum of the image size png Matlab
19 views (last 30 days)
Show older comments
Hello,
I have a matrix T (1, 2761843)
I want save it as like an image .png. I used the following line:
Imwrite (T,['image' num2str(5) '.png']);
I just get the following error.
Error using pngwritec
PNG library failed: image size exceeds user limits in IHDR.
Error in writepng (line 280)
pngwritec(data, map, filename, colortype, bitdepth, ...
Error in imwrite (line 546)
feval(fmt_s.write, data, map, filename, paramPairs{:});
No problem with JPEG 2000.
How I can find the maximum of image size .png (width and length) that we can create it with Matlab?
Thank you!
1 Comment
Rik
on 8 Jul 2020
You could try if the savepng mex function on the FEX suits your needs. I'm very far from fluent in C++, but it doesn't look like there is a limit imposed beyond the png format itself.
If you want to use Matlab tools, you could consider reshaping your data, prepending the true size and padding with zeros.
Accepted Answer
Rik
on 8 Jul 2020
Edited: Rik
on 8 Jul 2020
Short answer: trial and error.
Long answer:
This should probably be somewhere in the doc. Only after the trial and error did I actually go look for it, but I didn't find it in the imwrite or imformats documentation.
The official png spec suggests the maximum size in either dimension would be anything that fits in 4 bytes, well above what you are trying to do. So officially there is nothing wrong with what you're trying.
However, a test on my copy of R2020a shows the maximum is 10^6. I find it curious that the limitation is a rounded decimal, and not a rounded hex (e.g. 0xFFFFF, 0xFFFFE, or 0x0FFFF).
The only other limit seems to be that 'Images must contain fewer than 2^32 - 1 bytes of data.' So your other dimension can 'only' be 4294 pixels. That required about 34GB of RAM and writes a png of just over 4GB.
clc
fn='foo.png';
%increasing either by 1 will return an error
dim1=floor(2^32/10^6);
dim2=10^6;
try
if exist(fn,'file'),delete(fn);end
IM=uint8(randi(255,4294,dim2));
imwrite(IM,fn);
fprintf('size %d written correctly\n',dim1*dim2)
catch ME
fprintf('fail:%s\n',ME.message)
if exist(fn,'file'),delete(fn);end
end
2 Comments
Rik
on 9 Jul 2020
That last limit only means you can't have an image with 2^32 pixels (grayscale) or 2^32/3 pixels (RGB), which is a reasonable limit, since 2^32/3 is 1431655765.33. So you shouldn't have any issues with that limit for any reasonable situation.
More Answers (1)
Image Analyst
on 8 Jul 2020
If you want to save your 1-D vector as a 2-D image, I suggest you resize it first using reshape().
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!