Чтение изображений с SD

DDONN
Offline
Зарегистрирован: 27.01.2013

Здравствуйте! В программировани я новичок, и столкнулся с трудностью, есть необходимость сделать графическое меню с выводом на экран 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); ?
 
Стандартные примеры чтения карты сд работают хорошо, всё читаеться и пишет без проблем. 
 
 

 

leshak
Offline
Зарегистрирован: 29.09.2011

DDONN пишет:
tux[0x400] = SD.open("tux.c");

 
А что по вашему делает эта строчка?
 

Цитата:

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. И почитайте прикрепленную ветку о том как нужно код вставлять в темы.

DDONN
Offline
Зарегистрирован: 27.01.2013
tux[0x400] = SD.open("tux.c");

tux[0x400].read();

в таком виде компилятор выдаёт

error: request for member 'read' in 'tux', which is of non-class type 'unsigned int [1024]'

картинка предварительно подготовлена в imageConcerter565, что ужно ещё добавать в коде? 

 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Нужно не в коде добавлять, а идти читать что такое массивы, типы данных (и сколько они занимают в памяти), классы и функции.

Это же не "обучение у магистра магии", где нужно "правильно заклинание подобрать". Не будет тут у вас "вызвал одну функцию" и все заработало.

Нужно откладывать экран, учится побайтово читать из SD-карты, потом учится работать с массивами "заполнить массив, вывести массив".

Разобратся в каком формате сохраняет этот ваш imageConcerter565. Понимать что там лежит в файле с точностью до байта. И или "разбирать этот файл" или заранее подготавливать его в том виде в котором "вы умеете его читать".

Это же микроконтроллер, тут все "низкоуровнево". Каждый байт нужно вручную обрабатывать :) Функции "загрузить и показать" -  нет. Самому писать ее. Или гуглить библиотеки какие-то, может уже кто-то до вас написал.

Но все равно пропускать все что перечисленно в "идти читать..." - не желательно. Даже если готовая библиотека надйется.

Вот, к примеру, почему у вас

unsigned int tux[0x400] ;

А почему int? Почему unsigned? Почему не double или byte?  А сколько памяти занимает этот массив? А сколько всего у вас оперативки в вашем камне? 

Да банально, что вы вообще от строки tux[0x400].read(); ожидали? Или по другому, что по вашему она делает?

DDONN
Offline
Зарегистрирован: 27.01.2013

leshak пишет:

 

А почему int? Почему unsigned? Почему не double или byte?  А сколько памяти занимает этот массив? А сколько всего у вас оперативки в вашем камне? 

Да банально, что вы вообще от строки tux[0x400].read(); ожидали? Или по другому, что по вашему она делает?

unsigned int взято из примера который идёт с библиотекой UTFT, там этотже граф файл вставляеться в скетч и всё выводиться без проблем на экран. 

при использовании   ITDB02_Graph16.h и tinyFAT.h всё работало таким образом

file.initFAT();
 myGLCD.loadBitmap(10, 10, 145, 100, "tux.raw");

Мне ещё далеко до массивов и т.д, я пока код собираю изкусочков

leshak
Offline
Зарегистрирован: 29.09.2011

DDONN пишет:

 там этотже граф файл вставляеться в скетч и всё выводиться без проблем на экран. 

Ну значит там массив заполняется при инициализации. Значениями из скетча. А вам нужно разобратся как заполнять массив "из файла" (естественно предполагается что в файле лежат те же самые значения).

DDONN пишет:

при использовании   ITDB02_Graph16.h и tinyFAT.h всё работало таким образом

file.initFAT();
 myGLCD.loadBitmap(10, 10, 145, 100, "tux.raw");

Ну вот это и есть тот случай когда "кто-то уже написал". Внутри эта LoadBitmap в любом случае вначале побайтово читает этот файл в какой-то массив, а потом уже выводит его. Или "прочитала байт" - отправила рисовать. Можно заглянуть внутрь ее и посмотреть как она это делает.

Но, как я понял - вас это не устраивает. Так как чтение файла происходит каждый раз как только нужно картинку нарисовать. Вы хотите один раз прочитать ее в память, а потом выводить в разные места. (но тут все равно нужно будет разбиратся с типами и следить что-бы "влезло в память").

DDONN пишет:

Мне ещё далеко до массивов и т.д, я пока код собираю изкусочков

Если не идти к этому, то всегда будет "далеко". Это же не какое-то "колдунство 80-того уровня требующего двух высших образований". Это БАЗОВЫЕ вещи. Лепить из кусочков наугад - все равно ничего не выйдет (если хотите сами делать). Кусочки брать - это правильно. Но нельзя брать их "бездумно". Взяли "кусочек", нужно с точностью до буквы разобратся "что он делает и почему именно так". Только в этом случае его можно использовать в своем коде.

Так что откладывайте экран, идите в раздел "Программирование". Читайте про типы и массивы. Сделайте файлик с текстом "ABCD", прочитайте его в массив mass[4], выведите в Serial. Как буквы и как HEX значения.