-
-
Notifications
You must be signed in to change notification settings - Fork 56.5k
Unicode Path/Filename for imread and imwrite #4292
Copy link
Copy link
Closed
Description
Transferred from http://code.opencv.org/issues/1268
|| Richard Steffen on 2011-07-29 13:28
|| Priority: Low
|| Affected: None
|| Category: highgui-images
|| Tracker: Feature
|| Difficulty:
|| PR:
|| Platform: None / None
Unicode Path/Filename for imread and imwrite
Currently, the imread and imwrite method only supports std::string as an input. This isn't working with non-ascii directories/paths. Therefore, the a software depends on OpenCV can not guaranty working on all maschines.
History
Alexander Shishkov on 2012-02-12 20:47
- Description changed from Currently, the imread and imwrite method
only supports std::string as an inpu... to Currently, the imread and
imwrite method only supports std::string as an inpu... More
Vadim Pisarevsky on 2012-04-04 11:58
std::string is still capable of storing any unicode name via UTF-8 encoding, and so it's fopen responsibility to handle this UTF-8 name properly. On Mac and Linux I was able to store image into a file with non-ASCII letters using normal cv::imwrite(). I guess, on Windows it will work too, if you save a source file to UTF-8.
- Priority changed from High to Low
- Assignee set to Vadim Pisarevsky
- Status changed from Open to Cancelled
Andrey Kamaev on 2012-05-18 14:20
- Target version set to 2.4.0
n n on 2014-03-18 13:11
AFAIK fopen does not support Unicode on Windows and can't be used to open a path with Unicode characters. The UTF-8 string must be converted to UTF-16 and given to _wfopen instead. See ImageMagick's fopen_utf8 wrapper for example code: http://www.imagemagick.org/api/MagickCore/utility-private_8h_source.html#l00103
- Target version changed from 2.4.0 to 2.4.9
- Status changed from Cancelled to Open
n n on 2014-03-19 10:48
One possible workaround for now using Boost and a memory mapped file:
mapped_file map(path(L"filename"), ios::in);
Mat file(1, numeric_cast<int>(map.size()), CV_8S, const_cast<char*>(map.const_data()), CV_AUTOSTEP);
Mat image(imdecode(file, 1));
The downside is that I/O errors cause access violations instead of C++ exceptions. Also don't write to the "file" Mat. :)
n n on 2014-03-19 11:20
Unfortunately the trick of avoiding to store the image file in memory doesn't work with imwrite, as imencode stores the output in a vector with standard allocator specified. If memory is no issue the contents can of course be written to file using Boost afterwards.
Alexander Smorkalov on 2014-04-02 01:18
- Target version changed from 2.4.9 to 3.0
Reactions are currently unavailable