Найти - Пользователи
Полная версия: PIL Image.fromstring
Начало » Python для экспертов » PIL Image.fromstring
1 2
mrgloom
вообщем есть такой код на питоне
где сверху приходит бинарная строка img_str, потом с помощью PIL

img = Image.fromstring(“L”, (size, size), img_str)
img.save('test_image.png')

проверяю test.dat получен с помощью
fd= open(“test.dat”,'wb')"))
fd.write(img_str)
fd.close()

через интерпертатор картинка валидная
>>> import Image
>>> fd=open(“C:/test.dat”,'rb')
>>> s=fd.read()
>>> len(s)/512
512
>>> im=Image.fromstring(“L”,(512,512),s)
>>> im.show()

пытаюсь прочитать через c++ и opencv
const char *filename = "C:/test.dat";
ifstream infile(filename, fstream::in/*,fstream::binary*/);
	//картинка у нас одноканальная заданного размера
infile.seekg(0,ios::end);
int file_size=infile.tellg();
infile.seekg(0,ios::beg);
std::vector<unsigned char> data(file_size, 0);
infile.read(reinterpret_cast<char*>(&data[0]), file_size); 
cv::Mat img(data);
int c= img.channels();
cv::Mat r= img.reshape(0,512);
imwrite("C:/test.png",r);
картинка получается невалидная.
py.user.next
std::ifstream infile(filename, std::ios::binary);
mrgloom
ага, так всё ок, только я не понимаю почему?
py.user.next
в текстовом режиме над символами потока могут проводится преобразования, которые не влияют на текст
Андрей Светлов

py.user.next, ты еще помнишь С++? Приятно. Я лет пять его не применял :(

py.user.next
в C++ слишком большой стандарт, да и смысл его изучать
а C изучаю постоянно, чередую с питоном и теорией программирования
doza_and
мне кажется так будет лучше.
std::ifstream infile(filename, std::ios::binary|std::ios::in);
py.user.next
ifstream - уже поток ввода
mrgloom
std::ifstream infile(filename,std::ios::in,std::ios::binary);

дело было в том компилятор съел и так, а я не заметил что через запятую.
py.user.next
mrgloom
дело было в том компилятор съел и так, а я не заметил что через запятую.

в gcc:
на
std::ifstream infile(filename, std::ios::in, std::ios::binary);

реакция
[guest@localhost tests]$ g++ t.cpp -o t
t.cpp: В функции ‘int main()’:
t.cpp:11:66: ошибка: нет подходящей функции для вызова ‘std::basic_ifstream<char>::basic_ifstream(const char*&, const std::ios_base::openmode&, const std::ios_base::openmode&)’
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/fstream:455:7: замечание: претенденты: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char, _Traits = std::char_traits<char>, std::ios_base::openmode = std::_Ios_Openmode]
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/fstream:441:7: замечание: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../include/c++/4.5.1/iosfwd:111:11: замечание: std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)
[guest@localhost tests]$

неверное количество аргументов
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB