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

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

09.08.2012, 14:18. Показов 5499. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru