Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Загрузка изображений в кэш


Автор: Salatovec 25.4.2010, 17:56
Доброго всем времени суток, подскажите - в какой контейнер можно подгрузить изображения, независимо от их расширения, поясню:

есть ряд изображений расширения bmp и jpeg, мне их необходимо подгрузить с жёсткого диска в кэш, а после последовательно (с какой то частотой кадров) вывести на экран.

Со второй частью задачи проблем нету, а вот с первой  - есть. Раньше, когда была задача с одним типом файлов, например бмп, делал так:
Код

#include <vector.h>
vector<Graphics::TBitmap*> bmplist;


И после, в этот контейнер, по циклу пихал изображения. Но теперь одними бмпхами не отделаешься =\

Заранее спасибо!

Автор: Sosed 25.4.2010, 18:30
Если для всех видов изображения есть свои классы(TBitmap ...), то возможно так:

Код

struct Picture {
  void *pic;
  int type;
};
vector<Picture*> piclist;

А когда выводим кастим из void в нужный тип поглядывая на type

Автор: mes 25.4.2010, 19:25
а можно конвертировать при загрузке в общий тип изображения.

Автор: xvr 26.4.2010, 12:53
DirectShow выводит все, что выводится  smile 

Автор: SenkraD 26.4.2010, 13:05
Salatovec,  на сколько я понял, то это Builder и, если память
не изменяет,  там у всех этих классов картинок был общий предок (TPicture, кажись) -
вот и храни указатели на него в векторе.

Автор: Salatovec 26.4.2010, 19:11
SenkraD, вот этот вариант, думаю, больше всего мне подходит  smile 
Делаю так:
Код

vector<TPicture*> pic01;

TPicture *pic = new TPicture;
for(int i = 0; i < 10; i++)
{
    pic->LoadFromFile(PathToMyCustomPicture[i]);
    pic01.push_back(pic);
}

Image1->Picture = pic01[0];


На последнюю строчку компилятор ругается. Что не так?

Автор: mes 26.4.2010, 20:34
Salatovec, обратите внимание, что вызывали new один раз хотя картинок предполагаете 10..
к тому же хранить указатели на объекты в векторы нужно очень осторжно, поэтому не желательно..
ошибка скорей всего из за того, что указатель надо разьименовывать перед присваиванием..
хотя было бы с Вашей стороны было б повежливей не скрывать текст, заставляя форумчан ломать голову, а привести текст ошибки.

ну вообшем должно быть примерно следущее:
Код

vector<TPicture> pic01;
pic01.resize (10);

for(int i = 0; i < 10; ++i)
    pic01[i].LoadFromFile(PathToMyCustomPicture[i]);

Image1->Picture = pic01[0];


Автор: xvr 26.4.2010, 22:04
Код

Image1->Picture->Assign(pic01[0]);

Автор: Alexeis 26.4.2010, 22:35
Цитата(SenkraD @  26.4.2010,  12:05 Найти цитируемый пост)
там у всех этих классов картинок был общий предок (TPicture, кажись) -

  TGraphic общий предок. TPicture универсальный контейнер, который может хранить любой TGraphic + дополнительные фичи. Можно сказать целый монстр. 

Автор: Salatovec 26.4.2010, 23:16
mes, делаю так, как Вы сказали:
Код

vector<TPicture*> pic01;

pic01.clear();
pic01.resize(1);
pic01[0]->LoadFromFile("Picture.jpeg");


Когда программа доходит до последней строчки, выдаётся сообщение о следующей ошибке:
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 004289E3 in module 'Project1.exe'. Read of adress 00000000'.

Автор: mes 26.4.2010, 23:20
Цитата(Salatovec @  26.4.2010,  22:16 Найти цитируемый пост)
делаю так, как Вы сказали:

я сказал не так.. посмотрите что хранит вектор у меня, а что у Вас .. 
smile

Автор: Alexeis 27.4.2010, 09:21
Цитата(mes @  26.4.2010,  22:20 Найти цитируемый пост)

я сказал не так.. посмотрите что хранит вектор у меня, а что у Вас .. 

  Во всем виновата проклятая звездочка smile .

Автор: Salatovec 27.4.2010, 11:57
mes,  точно, недоглядел  smile 
Теперь ругается на:
Код

Image1->Picture = pic01[0];

[BCC32 Error] Main.cpp(167): E2034 Cannot convert 'TPicture' to 'TPicture *'

Автор: mrbrooks 27.4.2010, 12:29

Код

    std::vector<TPicture *>pic01;
    for(int i = 0; i<5; i++)
    {
        TPicture *pic = new TPicture();
        pic->LoadFromFile("01.bmp");
        pic01.push_back(pic);
    }
    img1->Picture->Assign(pic01[0]);
    for(int i = 0; i<5; i++) delete pic01[i];


Автор: Salatovec 27.4.2010, 12:49
mrbrooks, спасибо, работает  smile 
Ток вопрос возник, а pic не надо делитить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)