Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151

Загрузка jpg изображений из dll

09.08.2012, 14:18. Показов 5587. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я понимаю, что темы с таким названием уже существуют, но ответа в них я так и не нашел... Я разобрался как создать dll, но в TImage картинку из него вытащить мне так и не удалось. Не находит ресурс.
В заголовке пишу:
C++
1
HANDLE h = LoadLibrary("Celestia_Config_Manager.dll");
в ListBox1Click пишу:
C++
1
Image5->Picture->Bitmap->LoadFromResourceName((unsigned int)h,"JPGIMAGE_1");
все компилируется, но при попытке клика по лист боксу, выдается ошибка (см. вложение).

Помогите пожалуйста. Мне нужно просто научиться загружать jpg картинки из dll в TImage.
Миниатюры
Загрузка jpg изображений из dll  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2012, 14:18
Ответы с готовыми решениями:

AS 3.0 Загрузка изображений jpg в приложение флеш
Пишу этот код: private function startLoad():void{ var loader:Loader = new Loader(); ...

Загрузка изображений jpg в приложение флеш
Вобщем задача выглядит как: загрузить пару жпегов в мой приложение, и в нужный момент вывести их. Сначала пробовал испоьзовать URLLoader,...

Импортировать в ресурсы 500 изображений JPG
Требуется импортировать в ресурсы проекта MFC 500 изображений формата JPG. Можно ли каким-то образом импортировать сразу всю папку с...

17
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 18:23
картинка в ресурсах в BITMAP'е находится?
0
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
09.08.2012, 18:28  [ТС]
Смысле?
Если в dll, то нет, она (а точнее они) в RCData.
Миниатюры
Загрузка jpg изображений из dll  
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 18:29
В справка написано, что TBitmap::LoadFromResourceName работает с BITMAP ресурсом
0
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
09.08.2012, 18:41  [ТС]
Поточнее обьясни пожалуйста) Мне то что делать теперь?
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 19:00
попробуй с RCDATA в BITMAP перетащить.
или использовать TJPEGImage, в котором тоже есть метод LoadFromResourceName, но который загружает картинку из RCDATA (если не ошибаюсь), потом этот TJPEGImage присвоишь Image'у (Image->Picture)

понятно или нужен код?
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
09.08.2012, 19:34  [ТС]
Когда пытаюсь создать там папку BITMAP она переименовывается в "Точечный рисунок", но в нее jpg не добавляются, наверное только bmp. Давай код того, что выше писал)

Добавлено через 6 минут
Проверил. Из этой папки тоже почему-то не грузятся ресурсы... поэтому давай твой метод)))
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 21:03
Цитата Сообщение от Alexell Посмотреть сообщение
поэтому давай твой метод)))
у меня кода изначально не было, я лишь просто спросил.

метод LoadFromResourceName оказывается отсутствует у TJpegImage, поэтому
нужно другой функцией загружать. Первое, что приходит в голову, это загружать функцией LoadResource.
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
09.08.2012, 21:11  [ТС]
Может все-таки распишешь как то? у TImage есть только LoadFromResourseName и LoadFromResourseID. а еще LoadFromStream какой то... Но ты же видишь, что у меня не находит ресурсы((( Мне надо как то справиться с этим((( Помоги плиз.
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
09.08.2012, 22:49
Вообщем вот (проверил-работает):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    // Загрузка DLL-ки с JPG
    HMODULE hDLL = LoadLibrary(L"..\\..\\1.dll");
    if ( hDLL == NULL )
    {
        ShowMessage(L"error LoadLibrary");
        return;
    }
 
    // Находим Resource Information Block
    HRSRC hResInfo = FindResource(hDLL, L"JPGIMAGE_1", RT_RCDATA);
    if ( hResInfo == NULL )
    {
        ShowMessage(L"error FindResource");
        return;
    }
 
    // Узнаем размер ресурса в байтах
    int iResSize = SizeofResource(hDLL, hResInfo);
    if ( hResInfo == NULL )
    {
        ShowMessage(L"error SizeofResource");
        return;
    }
 
    // Получаем хендл ресурса
    HGLOBAL hResource = LoadResource(hDLL, hResInfo);
    if ( hResource == NULL )
    {
        ShowMessage(L"error LoadResource");
        return;
    }
 
    // Получаем указатель на ресурс
    void *pResource = LockResource(hResource);
    if ( hResource == NULL )
    {
        ShowMessage(L"error LockResource");
        return;
    }
 
    // Записываем в Memory поток JPG-файл
    TMemoryStream *ms = new TMemoryStream;
    ms->Write(pResource, iResSize);
    ms->Position = 0;
 
    // Загружаем в TJPEGImage наш jpg-файл из потока
    TJPEGImage *jpg = new TJPEGImage;
    jpg->LoadFromStream(ms);
    delete ms;
 
    // Копируем картинку на Image
    Image1->Picture->Assign(jpg);
Добавлено через 29 минут
Нашел код полегче (не проверял):
https://www.cyberforum.ru/post2505977.html

Добавлено через 46 минут
Долго мучился со способом, приведенным по ссылке (из-за последнего параметра конструктора TResourceStream).
Типичная ошибка, которая может случится - это вызвать конструктор следующим образом:
C++
1
TResourceStream((THandle)hDLL, L"JPGIMAGE_1", L"RT_RCDATA");
а надо
C++
1
TResourceStream((THandle)hDLL, L"JPGIMAGE_1", RT_RCDATA);
Вообще вот код (проверил - работает (BuilderXE)):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    #include <jpeg.hpp>
    ...
    HMODULE hDLL = LoadLibrary(L"..\\..\\1.dll");
    if (hDLL == NULL)
    {
        ShowMessage("error loading dll");
        return;
    }
 
    TResourceStream *ms = new TResourceStream((THandle)hDLL, L"JPGIMAGE_1", RT_RCDATA);
    TJPEGImage *jpeg = new TJPEGImage();
    jpeg->LoadFromStream(ms);
    Image1->Picture->Bitmap->Assign(jpeg);
    // или так: Image1->Picture->Assign(jpeg); // но так долго загружается в TImage
    delete ms;
    delete jpeg;
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
10.08.2012, 03:24
DLL, как контейнер изображений. [FAQ]
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
10.08.2012, 06:27
Там расписано про картинку формата png, который грузится классом TPngImage.
У TPngImage есть метод LoadFromResourceName.

В данной теме была проблема загрузки JPG-файла из ресурсов.
JPG-файл грузится через класс TJPEGImage, у которого, если посмотреть описание, нету метода LoadFromResourceName.

Поэтому пришлось изобретать велосипед.
0
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
10.08.2012, 10:07  [ТС]
Вобщем написал перед TForm1 *Form1;
C++
1
HMODULE hDLL = LoadLibrary(L"Celestia_Config_Manager.dll");
Затем в ListBox1Click написал как ты сказал, но выдает ошибки относиттельно строчки вверху где мы подключаем библиотеку:
C++
1
2
[C++ Error] Unit1.cpp(17): E2034 Cannot convert 'wchar_t *' to 'const char *'
[C++ Error] Unit1.cpp(17): E2342 Type mismatch in parameter 'lpLibFileName' (wanted 'const char *', got 'wchar_t *')
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
10.08.2012, 10:19
Какая версия Билдера?

Добавлено через 3 минуты
Если весия Билдера ниже, чем Builder 2009, то вот какой код подойдет (убрана "L"):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    #include <jpeg.hpp>
    ...
    HMODULE hDLL = LoadLibrary("..\\..\\1.dll");
    if (hDLL == NULL)
    {
        ShowMessage("error loading dll");
        return;
    }
 
    TResourceStream *ms = new TResourceStream((THandle)hDLL, "JPGIMAGE_1", RT_RCDATA);
    TJPEGImage *jpeg = new TJPEGImage();
    jpeg->LoadFromStream(ms);
    Image1->Picture->Bitmap->Assign(jpeg);
    // или так: Image1->Picture->Assign(jpeg); // но так долго загружается в TImage
    delete ms;
    delete jpeg;
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
10.08.2012, 10:27  [ТС]
Все дружище! Заработало!!! Спасибо тебе огромное, хотя у меня еще один вопрос, а вот если у меня 10 картинок, и в ListBox я их переключаю, то как лучше мне оформить это?
Я переключение через switch сделал, в case у меня:
C++
1
2
3
tempjpg->LoadFromStream(c1);
Image5->Picture->Bitmap->Assign(tempjpg);
tempjpg=NULL;
а вот как эти вот стримы оформить? надо один раз его создать, и в case потом заменять в нем картинку, подскажи как, а то я 10 стримов сделал разных...
0
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
10.08.2012, 10:49
Цитата Сообщение от Alexell Посмотреть сообщение
а вот если у меня 10 картинок, и в ListBox я их переключаю, то как лучше мне оформить это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <jpeg.hpp>
...
#define TOTAL_RES_JPG 2 // у меня две картинки в ресурсах
TJPEGImage *jpegs[TOTAL_RES_JPG]; // массив из 2-х указателей на TJPEGImage
 
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
 
}
 
// Обработчик события OnClick (ListBox1)
//---------------------------------------------------------------------------
void __fastcall TForm3::ListBox1Click(TObject *Sender)
{
    TListBox *list = (TListBox*)Sender;
    if ( list->ItemIndex != -1 )
    {
        Image1->Picture->Bitmap->Assign(jpegs[list->ItemIndex]);
    }
}
//---------------------------------------------------------------------------
 
 
// Обработчик события OnActivate (Form)
// Для того, чтобы загрузка картинок произошла сразу после отображения формы
void __fastcall TForm3::FormActivate(TObject *Sender)
{
    HMODULE hDLL = LoadLibrary(L"..\\..\\1.dll");
    if (hDLL == NULL)
    {
        ShowMessage("error loading dll");
        return;
    }
 
    for (int i = 0; i < TOTAL_RES_JPG; i++)
    {
        TResourceStream *ms = new TResourceStream((THandle)hDLL, "JPGIMAGE_" + IntToStr(i+1), RT_RCDATA);
        TJPEGImage *jpeg = new TJPEGImage();
        jpeg->LoadFromStream(ms);
        jpegs[i] = jpeg; // сохраняем в массиве указатель на TJPEGImage
        delete ms;
    }
}
1
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
10.08.2012, 10:58  [ТС]
Спасибо большое. Вечером займусь.
0
Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151
11.08.2012, 15:41  [ТС]
Все в принципе сделал, единственное, с чем возникли проблемы - это идентификаторы. Переименовывание в restoratore не помогает изменить идентификатор. Похоже, чтобы добавить картинки, в будущем придется все время dll изменять и перекомпилировать в билдере, это неудобно, но других вариантов не вижу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2012, 15:41
Помогаю со студенческими работами здесь

Написать конвертер изображений BMP to JPG
Здравствуйте. Я делаю проект и передо мной стоит задача написать конвертацию bmp в jpg на сях. Кто занимался чем то подобным , покидайте...

Вставка jpg-изображений из папки в Word
Доброго времени суток! Коллеги собираюсь написать программу, которая бы из папки в которой находятся картинки, грузила их в документ...

Добавление изображений разных форматов (gif, jpg, и т.д.)
Здравствуйте. Даны следующие файлы, которые работают с изображениями. Как сделать так, чтобы можно было работать с разными форматами...

Добавление изображений разных форматов (gif, jpg, и т.д.)
Здравствуйте. Как сделать так, чтобы можно было добавлять разные форматы изображений? Все нижеперечисленные файлы запускаются через...

Посоветуйте хороший компрессор изображений jpg, png, gif
Нужна программка для пакетной оптимизации изображений форматов jpg, png, gif. На примере сайта http://www.punypng.com/ только офлайн...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru