Чтение изображений с SD
- Войдите на сайт для отправки комментариев
Вс, 27/01/2013 - 07:39
Здравствуйте! В программировани я новичок, и столкнулся с трудностью, есть необходимость сделать графическое меню с выводом на экран 3.2, библиотека экрана UTFT, библиотека карты SD.
В библиотеке UTFT вывод картинки выглядит след образом
myGLCD.drawBitmap (32, 32, 32, 32, tux);
чтение с картыделаю так
unsigned int tux[0x400] ;
tux[0x400] = SD.open("tux.c");
при этом на экране выводиться область картинки с мазнёй цветной, а не нжной картинкой, при вытаскивании карты памяти ни чего не меняеться мазня аналогичная.
Как правильно считать картинку с карты для использования в
myGLCD.drawBitmap (32, 32, 32, 32, tux); ?
Стандартные примеры чтения карты сд работают хорошо, всё читаеться и пишет без проблем.
Returns:
a File object referring to the opened file; if the file couldn't be opened, this object will evaluate to false in a boolean context, i.e. you can test the return value with "if (f)".
Кратко: File.Open возвращает ссылку на объект типа Файл.
С чего вы взяли что он вернет ссылку на массив байтов? И уж тем более он не заполнит существующий массив.
Вам нужно ручками, по байту, самому, с помощью http://arduino.cc/en/Reference/FileRead вычитывать содержимое этого файла и помещать в tux. Это в случае если в файле содержится "сырое содержимое" картинки. То есть если в файле лежат байты в точности в том виде как они должны быть в массиве tux.
Если же файл в "каком-то графическом формате" - то его еще распарсить нужно. Привести в "сырой вид" перед запихиванием в tux.
P.S. И почитайте прикрепленную ветку о том как нужно код вставлять в темы.
в таком виде компилятор выдаёт
error: request for member 'read' in 'tux', which is of non-class type 'unsigned int [1024]'
картинка предварительно подготовлена в imageConcerter565, что ужно ещё добавать в коде?
Нужно не в коде добавлять, а идти читать что такое массивы, типы данных (и сколько они занимают в памяти), классы и функции.
Это же не "обучение у магистра магии", где нужно "правильно заклинание подобрать". Не будет тут у вас "вызвал одну функцию" и все заработало.
Нужно откладывать экран, учится побайтово читать из SD-карты, потом учится работать с массивами "заполнить массив, вывести массив".
Разобратся в каком формате сохраняет этот ваш imageConcerter565. Понимать что там лежит в файле с точностью до байта. И или "разбирать этот файл" или заранее подготавливать его в том виде в котором "вы умеете его читать".
Это же микроконтроллер, тут все "низкоуровнево". Каждый байт нужно вручную обрабатывать :) Функции "загрузить и показать" - нет. Самому писать ее. Или гуглить библиотеки какие-то, может уже кто-то до вас написал.
Но все равно пропускать все что перечисленно в "идти читать..." - не желательно. Даже если готовая библиотека надйется.
Вот, к примеру, почему у вас
А почему int? Почему unsigned? Почему не double или byte? А сколько памяти занимает этот массив? А сколько всего у вас оперативки в вашем камне?
Да банально, что вы вообще от строки tux[0x400].read(); ожидали? Или по другому, что по вашему она делает?
А почему int? Почему unsigned? Почему не double или byte? А сколько памяти занимает этот массив? А сколько всего у вас оперативки в вашем камне?
Да банально, что вы вообще от строки tux[0x400].read(); ожидали? Или по другому, что по вашему она делает?
unsigned int взято из примера который идёт с библиотекой UTFT, там этотже граф файл вставляеться в скетч и всё выводиться без проблем на экран.
при использовании ITDB02_Graph16.h и tinyFAT.h всё работало таким образом
Мне ещё далеко до массивов и т.д, я пока код собираю изкусочков
там этотже граф файл вставляеться в скетч и всё выводиться без проблем на экран.
Ну значит там массив заполняется при инициализации. Значениями из скетча. А вам нужно разобратся как заполнять массив "из файла" (естественно предполагается что в файле лежат те же самые значения).
при использовании ITDB02_Graph16.h и tinyFAT.h всё работало таким образом
Ну вот это и есть тот случай когда "кто-то уже написал". Внутри эта LoadBitmap в любом случае вначале побайтово читает этот файл в какой-то массив, а потом уже выводит его. Или "прочитала байт" - отправила рисовать. Можно заглянуть внутрь ее и посмотреть как она это делает.
Но, как я понял - вас это не устраивает. Так как чтение файла происходит каждый раз как только нужно картинку нарисовать. Вы хотите один раз прочитать ее в память, а потом выводить в разные места. (но тут все равно нужно будет разбиратся с типами и следить что-бы "влезло в память").
Мне ещё далеко до массивов и т.д, я пока код собираю изкусочков
Если не идти к этому, то всегда будет "далеко". Это же не какое-то "колдунство 80-того уровня требующего двух высших образований". Это БАЗОВЫЕ вещи. Лепить из кусочков наугад - все равно ничего не выйдет (если хотите сами делать). Кусочки брать - это правильно. Но нельзя брать их "бездумно". Взяли "кусочек", нужно с точностью до буквы разобратся "что он делает и почему именно так". Только в этом случае его можно использовать в своем коде.
Так что откладывайте экран, идите в раздел "Программирование". Читайте про типы и массивы. Сделайте файлик с текстом "ABCD", прочитайте его в массив mass[4], выведите в Serial. Как буквы и как HEX значения.