Мы сами всего творцы!
 Аватар для Alexell
60 / 23 / 1
Регистрация: 06.06.2012
Сообщений: 151

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

09.08.2012, 14:18. Показов 5548. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru