|
|
|
Можно ли загрузать картинку в Picture?, bmp, из файла.
|
|||
|---|---|---|---|
|
#18+
Если это можно сделать, то подскажите как, плз. И какой тип должен быть у Picture? Bitmap\Rectangle или... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 20:29 |
|
||
|
Можно ли загрузать картинку в Picture?, bmp, из файла.
|
|||
|---|---|---|---|
|
#18+
Используй TGraphic или TPicture ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 22:01 |
|
||
|
Можно ли загрузать картинку в Picture?, bmp, из файла.
|
|||
|---|---|---|---|
|
#18+
Вроде вот так: Картинки в ресурсах Картинки можно поместить в ресурс как используя файл ресурсов проекта (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; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 03:57 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2032927]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
84ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 389ms |

| 0 / 0 |
