powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли загрузать картинку в Picture?, bmp, из файла.
4 сообщений из 4, страница 1 из 1
Можно ли загрузать картинку в Picture?, bmp, из файла.
    #33200415
iNq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNq
Гость
Если это можно сделать, то подскажите как, плз.

И какой тип должен быть у Picture? Bitmap\Rectangle или... ?
...
Рейтинг: 0 / 0
Можно ли загрузать картинку в Picture?, bmp, из файла.
    #33200471
diashi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй TGraphic или TPicture
...
Рейтинг: 0 / 0
Можно ли загрузать картинку в Picture?, bmp, из файла.
    #33200617
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде вот так:

Картинки в ресурсах

Картинки можно поместить в ресурс как используя файл ресурсов проекта (project1.res) так и отдельный файл ресурсов, аналогично описанному выше хранению текста и программ.

Для рассмотрения первой возможности создадим новый проект и поместим на форму компонент TImage и два компонента TButton. В директорию проекта поместим любой рисунок в формате bmp (например "a.bmp") и откроем его в любом графическом редакторе, например в Microsoft Paint. Не компилируя проект запустим Image Editor (меню Tools/Image Editor). Далее откроем project1.res из директории проекта(File/Open, Projects/project1.res). Выполняем правый клик в поле открывшегося окна и в контекстном меню выбираем пункт New/Bitmap.

И сразу видим недостаток этого метода - максимальное число цветов для изображения - 256. Устанавливаем число цветов и размер (его определяем в Paint - меню Рисунок/Атрибуты). В файле у Contens появилась новая ветвь Bitmap с именем рисунка Bitmap1. (Можно воспользовавшись контекстным меню пунктом "Rename" и переименовать рисунок, например в MYBITMAP, но для наглядности делать этого не будем). Выполним двойной клик на имени рисунка - откроется окно редактора с пустым рисунком. Перенесем рисунок из Paint (ctrl+A, Ctrl+C) (можно и нарисовать свой рисунок в Image Editor) в окно Image Editor(ctrl+V). Закроем окно редактора рисунка и Image Editor, естественно на вопрос: "Save Changes..." кликнем "Yes".

Создадим обработчик нажатия для кнопки 2 и запишем несколько вариантов кода,позволяющего отображать и сохранять рисунок:

void __fastcall
TForm1::Button2Click(TObject *Sender)
{
//Вариант 1 - загрузка функцией LoadFromResourceName()
Image1->Picture->Bitmap->LoadFromResourceName
((int)HInstance,"Bitmap1");
//Вариант 2 - загрузка функцией LoadImage()
HBITMAP hBmp=LoadImage(GetModuleHandle(NULL),
"Bitmap1",IMAGE_BITMAP,0,0,
LR_COPYFROMRESOURCE | LR_DEFAULTCOLOR |
LR_CREATEDIBSECTION);
if(hBmp == 0)
ShowMessage("Картинка не загружена");
else
Image1->Picture->Bitmap->Handle=hBmp;

//Вариант 3 - через использование TBitmap
Graphics::TBitmap* ptBitmap;
ptBitmap = new Graphics::TBitmap();
ptBitmap->LoadFromResourceName((int)HInstance,"Bitmap1");
Image1->Width=ptBitmap->Width;
Image1->Height=ptBitmap->Height;
//И отобразить несколькими способами
// a).
Image1->Picture->Bitmap->Assign((TPersistent*)ptBitmap);
// b).
BitBlt(Image1->Canvas->Handle,0,0,ptBitmap->Width,ptBitmap->Height,
ptBitmap->Canvas->Handle,0,0,SRCCOPY);
// c).
Image1->Canvas->Draw(0,0,ptBitmap);
}

Откомпилируем и загрузим приложение, при нажатии кнопки 2 изображение появится в компоненте TImage.

Для рассмотрения использования отдельного файла ресурса в проект внесем некоторые изменения.

В обработчиках событий ButtonClick запишем коды, приведенные ниже. После компиляции и запуска приложения нажимаем первую кнопку и закрываем приложение. Добавляем к проекту файл "a.rc". Вновь компилируем и запускаем приложение и нажимаем вторую кнопку - картинка отображается в компоненте Image.

void __fastcall
TForm1::Button1Click(TObject *Sender)
{
TStringList* ptSList = new TStringList();
ptSList->Clear();
ptSList->Add("MYBMP RT_BITMAP \"a.bmp\"");
ptSList->SaveToFile("a.rc");
delete ptSList;
}
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
TResourceStream* ptRes =
new TResourceStream((int)HInstance,"MYBMP","RT_BITMAP");
ptRes->SaveToFile("a.bmp");
Image1->Picture->LoadFromFile("b.bmp");
delete ptRes;
}

Пример полностью аналогичен предыдущему примеру, за исключением того, что для формирования файла .rc использован класс TStringList, а тип ресурса стал "RT_BITMAP".

Отображение рисунка возможно выполнить и немного по другому:

void __fastcall
TForm1::Button2Click(TObject *Sender)
{
Graphics::TBitmap *ptBitmap;
ptBitmap=new Graphics::TBitmap();
char *pchResType = "RT_BITMAP";
TResourceStream* ptRes =
new TResourceStream((int)HInstance, "MYBMP",pchResType);
ptBitmap->LoadFromStream(ptRes);
Image1->Picture->Assign((TPersistent*)ptBitmap);
delete ptRes;
delete ptBitmap;
}

Редактирование картинок из ресурсов и отображение отредактированных картинок.

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


void __fastcall
TForm1::Button2Click(TObject *Sender)
{
//Тип ресурса
char *pchResType = "RT_BITMAP";
//Поиск ресурса
HRSRC hSrsrc=FindResource(NULL,"MYBMP",pchResType);
if(!hSrsrc)
{ShowMessage("Ресурс не найден"); return;}
//Загрузка ресурса в память
HGLOBAL hGlobal=LoadResource(NULL,hSrsrc);
if(!hGlobal)
{ShowMessage("Ресурс не загружен"); return;}
//Фиксация ресурса или получения указателя на ресурс
void *pvResPtr=LockResource(hGlobal);
if(!pvResPtr)
{ShowMessage("Ресурс не зафиксирован"); return;}
TMemoryStream * ptMStream=new TMemoryStream();
//Размер ресурса
unsigned long vulResourceSize=SizeofResource(NULL,hSrsrc);
//Поток бит помещаем в массив по умолчанию для Stream
ptMStream->WriteBuffer(pvResPtr,vulResourceSize);
//На этом этапе можно сохранить ресурс в памяти
ptMStream->SaveToFile("a0.bmp");
//Буфер для маневра байтами
unsigned char * puchResourceBuffer =
new unsigned char[vulResourceSize];
//Переносим весь поток в буфер
memcpy(puchResourceBuffer, pvResPtr, vulResourceSize);
//Замена битов рисунка - для примера просто чуть чуть
//испортим картинку. Учитывая, что в файле 256 цветной .bmp
//биты рисунка начинаются с 0x436(1078)го байта спортим
//в картинке несколько байт
for(int i=1078; i < 1000; i++) puchResourceBuffer =i;
//Поток на начало
ptMStream->Seek(0,0);
//Сохранить в поток все с изменениями
ptMStream->Write(puchResourceBuffer,vulResourceSize);
//Поток на начало
ptMStream->Position=0;
//Опять сохраним и посмотрим, что получилось
//ptMStream->SaveToFile("a1.bmp");
Image1->Picture->Bitmap->LoadFromStream(ptMStream);
delete Stream;
delete puchResourceBuffer;
}

Тоже можно выполнить и чуть чуть по другому и с картинки из файла project1.res.

void __fastcall
TForm1::Button2Click(TObject *Sender)
{
Graphics::TBitmap* ptBitmap;
ptBitmap = new Graphics::TBitmap();
//Загружаем ресурс
ptBitmap->LoadFromResourceName((int)HInstance,"Bitmap1");
Image1->Width=ptBitmap->Width;
Image1->Height=ptBitmap->Height;
//Сдесь можно отобразить изображение
//Image1->Picture->Bitmap->Assign(Bitmap);
TMemoryStream * ptMStream=new TMemoryStream();
ptBitmap->SaveToStream(ptMStream);
//Можно сохранить то, что в потоке
ptMStream->SaveToFile("a1.bmp");
//Поток на начало
ptMStream->Seek(0,0);
//Буфер для манипуляции битами
puchResourceBuffer =
new unsigned char[ptMStream->Size];
ptMStream->Read(puchResourceBuffer,ptMStream->Size);
//Замена битов рисунка - портим рисунок
for(int i=1078; i < 1000; i++) puchResourceBuffer=i;
//Поток на начало
ptMStream->Seek(0,0);
//Сохранить в поток все с изменениями
ptMStream->Write(puchResourceBuffer,ptMStream->Size);
//Поток на начало
ptMStream->Position=0;
//Можно посмотреть, что получилось
Stream->SaveToFile("a1.bmp");
//Отобразить
Image1->Picture->Bitmap->LoadFromStream(Stream);
delete Bitmap;
delete Stream;
delete puchResourceBuffer;
}
...
Рейтинг: 0 / 0
Можно ли загрузать картинку в Picture?, bmp, из файла.
    #33202601
iNq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iNq
Гость
v skopin
Спасибо!!!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли загрузать картинку в Picture?, bmp, из файла.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]